【问题标题】:JavaFX16: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @...'JavaFX16:不支持的 JavaFX 配置:类是从“未命名模块 @...”加载的
【发布时间】:2021-08-17 11:06:24
【问题描述】:

我在 IntelliJ 上有一个 Maven 多模块项目,它生成 3 个 jar,其中 2 个是可执行文件,另一个用于公共资源。

其中一个可执行模块有一个主类,它询问用户是想用 CLI 还是 GUI 启动程序。

从 IntelliJ 运行这个 main 没有问题,而是当我使用 Maven 制作 jar 时(使用 maven shade):

mvn package -pl myModule -am

然后使用 GUI 选项启动 jar,出现以下警告:

com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @...'

GUI 然后毫无问题地启动。

如何消除此警告? 我项目的 JDK 是 openJDK 16(我已经添加了 module-info.java 以便使用 javafx)、openJFX 16、maven shade 插件 3.2.4、maven 编译器插件 3.8.1。

如果需要补充更多信息,我会补充。

【问题讨论】:

    标签: maven intellij-idea maven-shade-plugin openjfx java-16


    【解决方案1】:

    似乎 maven 正在将 JavaFX jar 着色为单个胖 jar。

    无法将多个模块放入同一个 jar 中,因为一个 jar 只能包含 1 个模块。所以,我想 shade 插件通过删除它使用的依赖项的模块信息文件来解决这个问题,这意味着 JavaFX 代码不会作为模块加载,你会收到这样的警告。

    我认为摆脱警告的唯一方法是不使用阴影,而是将 JavaFX 模块保存为单独的 jar 文件,然后在运行应用程序时将其放在模块路径中。

    【讨论】:

    • 首先感谢您的回复。我需要阴影,否则我将无法将“公共资源”模块包含到 jar 中,因此它不起作用(ClassNotFoundException)。至少,我认为这样做是有必要的,但我真的不知道。
    • @cathartyc 我不知道您的项目结构,但看起来您也可以手动列出阴影插件的包含:maven.apache.org/plugins/maven-shade-plugin/examples/… 所以,我认为您应该只能包含着色过程中的公共资源模块。
    • 我设法在没有 JavaFX 的情况下制作了 jar,但现在我不知道如何运行 jar。 JavaFX 模块由 Maven 控制,我怎样才能找到它们?而且这个项目是和另外两个人共享的,所以我不想使用绝对路径。我该怎么做?
    • @cathartyc 您可以使用mvn dependency:copy-dependencies 将依赖项复制到构建目录,然后您应该能够使用java -jar <main jar> -p <path to JavaFX jars folder> 之类的内容运行程序。从长远来看,您可能希望考虑使用jpackage 来创建应用程序的分发。 jpackage 可以创建带有 JVM/运行时和可执行启动器的包。
    • 非常感谢。我不能使用 jpackage 来完成这项工作,但我设法使用java -p <path/to/JavaFX/jars/folder> --add-modules ALL-MODULE-PATH -jar myJar.jar 命令使事情正常工作(实际上我在 jar 文件夹中做了一个批处理)。
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 2021-08-23
    • 2020-04-24
    • 2017-02-08
    • 2020-01-05
    • 2018-03-17
    • 2014-03-19
    相关资源
    最近更新 更多