gradle 模块java.base不会“打开java.lang.reflect”到模块com.jfocal

pkwftd7m  于 2023-10-19  发布在  Java
关注(0)|答案(2)|浏览(138)

在开始描述我是如何得到这个错误之前,这里有一些重要的信息:
1.在我的项目中使用module-info.java是必不可少的,因为jpackage不使用它就无法工作。
1.我使用SDK 14.0.2(这是启用包的最低版本)
1.任何评论都将受到赞赏;尽管如此,如果你要评论与使用特定VM参数相关的内容,我要求你按cnc +F来检查我是否已经使用了你要建议的参数-因为在我的build.gradle中有一堆VM参数-
好吧,让我们来看看我的问题:
首先,关注下面的VM参数:

"--add-opens=java.base/java.lang.reflect=com.jfoenix",

如果我不使用这个参数,程序运行时会弹出以下错误:

java.lang.reflect.InaccessibleObjectException: Unable to make boolean java.lang.reflect.AccessibleObject.setAccessible0(boolean) 
accessible: module java.base does not "opens java.lang.reflect" to module com.jfoenix

重要->这是我的视图如何显示,而不使用提到的VM参数(让我们称之为图像1):https://snipboard.io/QJ5Fdc.jpg
“好吧,那么你为什么不直接使用VM参数呢?“好问题!好了,让我们将它添加到我的VM参数中,然后再次运行程序。
在这样做之后,这就是我现在的视图(让我们称之为图2):https://snipboard.io/fbhGxw.jpg
太好了!这正是我的视图应该是的样子(注意,考虑到它像预期的那样工作,我这次没有错误)。
所以,一切正常后,我终于可以继续运行我的jpackage gradle任务了。在这样做之后,事情就没有意义了,因为在通过.exe(由jpackage生成)执行我的程序之后,我的视图看起来像“image 1”视图,而不管我的项目在使用“run”gradle任务运行时是否正常工作。

有没有想过为什么会发生这种情况?(我的猜测是,我的module-info.java是解决这个问题的关键,因为每次我删除一个“打开”语句,例如:“打开my.package.name到javafx.fxml”,程序得到了几乎相等的错误)。

让我知道是否需要任何代码样本。所有的帮助将不胜感激。谢谢你,谢谢

hgqdbh6s

hgqdbh6s1#

我发现正确解决这个问题的唯一方法是使用BurningWave:

<dependency>
        <groupId>org.burningwave</groupId>
        <artifactId>core</artifactId>
        <version>12.62.6</version>
</dependency>

添加依赖项后,只需将此代码复制/粘贴到init()方法中(此方法可以-并且应该-覆盖类中的init方法,该方法扩展了Application类,这是JavaFX应用程序的入口点)

org.burningwave.core.assembler.StaticComponentContainer.Modules.exportAllToAll();
        Class<?> bootClassLoaderClass = Class.forName("jdk.internal.loader.ClassLoaders$BootClassLoader");

        Constructor<? extends ClassLoader> constructor = ClassLoader.getPlatformClassLoader().getClass().getDeclaredConstructor(bootClassLoaderClass);

        constructor.setAccessible(true);
        Class<?> classLoadersClass = Class.forName("jdk.internal.loader.ClassLoaders");

        Method bootClassLoaderRetriever = classLoadersClass.getDeclaredMethod("bootLoader");

        bootClassLoaderRetriever.setAccessible(true);
vhmi4jdf

vhmi4jdf2#

我不知道jpackage gradle任务是如何工作的,我通过控制台在jdk内部使用jpackage工具,并且在创建包时使用了此参数

--java-options "--add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker=javafx.fxml --add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.colorpicker=javafx.fxml"

在那里,我打开PaintPicker从场景构建工具包到javafx.fxml
正如你所看到的,我必须打开两个包(实际上是五个,但放在这里太多了),你必须为每个包指定--add-opens来打开
我将使用jpackage打包应用程序的代码

jpackage.exe 
    --module-path 
        .;D:\builds\ikonlibrowser\target\ikonlibrowser.jar;
        D:\builds\ikonlibrowser\libs\icons\ikonli-antdesignicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-bootstrapicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-boxicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-bpmn-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-captainicon-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-carbonicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-codicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-coreui-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-dashicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-devicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-elusive-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-entypo-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-evaicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-feather-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-fileicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-fluentui-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-fontawesome-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-fontawesome5-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-fontelico-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-foundation-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-hawcons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-icomoon-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-ionicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-ionicons4-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-jamicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-ligaturesymbols-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-lineawesome-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-linecons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-maki-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-maki2-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-mapicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-material-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-material2-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-materialdesign-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-materialdesign2-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-medicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-metrizeicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-microns-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-ociicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-octicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-openiconic-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-paymentfont-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-prestashopicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-remixicon-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-runestroicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-simpleicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-simplelineicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-subway-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-themify-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-typicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-unicons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-weathericons-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-websymbols-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-whhg-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-win10-pack-12.2.0.jar
D:\builds\ikonlibrowser\libs\icons\ikonli-zondicons-pack-12.2.0.jar
        D:\builds\ikonlibrowser\libs\scenebuilder-kit-16.0.0.jar;
        D:\builds\ikonlibrowser\libs\jfoenix-9.0.10.jar
        D:\builds\ikonlibrowser\libs\ikonli-core-12.2.0.jar;
        D:\builds\ikonlibrowser\libs\ikonli-javafx-12.2.0.jar
    --module jcc.app.ikonlibrowser/jcc.app.ikonlibrowser.Main 
    --name "Ikonli Browser" -d D:\builds\ikonlibrowser
    --win-dir-chooser 
    --input D:\builds\ikonlibrowser\app
    --vendor jCC 
    --app-version "1.0.0"
    --java-options 
        "--add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker=javafx.fxml
        --add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.colorpicker=javafx.fxml
        --add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.rotator=javafx.fxml
        --add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.slider=javafx.fxml
        --add-opens com.gluonhq.scenebuilder.kit/com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.gradientpicker=javafx.fxml"

当然,这只是一条线。
现在我将一步一步地解释它:
--module-path此参数用于指定应用使用的所有模块的路径。包括应用程序.jar
--module此参数指定应用程序的主类。首先是模块名,然后是类的全名。
--name这是指定应用程序名称。
-d指定输出路径。
--win-dir-chooser在安装打包的应用程序时提供选择安装路径的选项
--input指定包含应用外部资源的文件夹
--vendor供应商的名称。也许你的名字
--app-version应用程序的版本
--java-options JVM选项
我希望这对你有用,抱歉耽搁了。

相关问题