5

我正在捆绑一个应用程序,javapackager其中主 jar 是具有 module-info.class 的模块,但它依赖于许多其他普通的 jar,因此我将它们称为 module-info.java 中的自动模块。但是,javapackager抱怨找不到他们。如何让它找到自动模块的 jar 文件?

Exception: jdk.tools.jlink.plugin.PluginException: java.lang.module.FindException: Module rcf not found, required by com.username.commander.ui
Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "Mac Application Image" (mac.app) failed to produce a bundle.
    at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374)
    at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348)
    at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)

我尝试指定模块路径(第一个目录只有主模块 jar,第二个目录有所有非模块 jar):

/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/javapackager -deploy -native image \
-name Commander -title Commander -vendor "username" \
--module-path /Users/username/Dropbox/coding/commander/Commander-java/moduleJars:/Users/username/Dropbox/coding/commander/Commander-java/packageJars \
--module com.username.commander.ui/com.username.commander.ui.AppWindow \
-srcdir /Users/username/Dropbox/coding/commander/Commander-java/packageJars \
-outdir /Users/username/Dropbox/coding/commander/Commander-java/target \
-outfile Commander \
-Bruntime=target/jre-9.0.1 -Bicon=src/main/resources/icons/commander.icns \
-BappVersion=1.0 \
-Bmac.CFBundleIdentifier=com.username.Commander \
--add-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
--limit-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
-nosign -v
4

2 回答 2

6

因此,经过更多研究后,我确认了 nullpointer 的答案:自动模块根本不受支持,因为它们可以访问类路径,这破坏了 Java 9 模块的模块化。更多细节可以在大约一年前的讨论中找到:http: //mail.openjdk.java.net/pipermail/jigsaw-dev/2016-July/008559.html

所以在 Oracle 和 Java 社区决定如何处理这个问题之前,javapackagerJava 9 不会让你使用自动模块。如果您捆绑使用模块的应用程序,则所有依赖项也必须是模块。如果您需要非模块依赖项,那么您必须将所有 jar 设为非模块。如果您确实使您的 jar(s) 模块化,那么您必须使所有依赖项模块化,如果您不拥有这些依赖项,这可能需要大量工作或不可能。

如果您将所有内容都设为非模块,那么缺点当然是您无法获得仅包含您需要的模块的精简运行时的优势。这里有一个解决方法

于 2017-10-24T18:51:04.930 回答
2

进一步看,该异常似乎在其对自动模块的实现中是合理的,但该消息似乎伪装成BUG#JDK-8189671中所述。

似乎一个插件报告由于缺少module-info.class资源而将自动模块用作根!jlink应该预先检测使用自动模块作为 root 的尝试并清楚地报告错误。

因此,您应该将 指定--module-path为 modulesJars 。

附加说明:Java 打包工具 (javapackager) 使用该jlink工具为应用程序生成自定义 JRE。

于 2017-10-23T06:23:23.080 回答