如何使用javapackager查找自动模块

我正在使用javapackager捆绑一个应用程序,其中主jar是一个带有module-info.class的模块,但它依赖于许多其他普通旧jar的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) 

我已经尝试指定模块路径(第一个dir只有主模块jar,第二个dir有所有非模块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 

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

因此,在Oracle和Java社区决定如何处理这个问题javapackager ,Java 9中的javapackager不允许您使用自动模块。 如果捆绑使用模块的应用程序,则所有依赖项也必须是模块。 如果您需要非模块依赖项,那么您必须使所有jar非模块。 如果你确实使你的jar模块化,那么你必须使所有的依赖模块化,如果你不拥有这些依赖,这可能是很多工作或不可能。

如果你把所有东西都变成非模块,那么当然缺点是你没有得到更简洁的运行时的优势,只包括你需要的模块。 这里有一个解决方法。

进一步观察exception似乎在其自动模块的实现中是合理的,但消息似乎伪装成BUG#JDK-8189671中所述

似乎插件报告由于缺少module-info.class资源而自动模块被用作root用户! jlink应检测尝试使用自动模块作为root用户,并清楚地报告错误。

因此,您应该指定modularJars的--module-path

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