【问题标题】:How to find automatic modules with javapackager如何使用 javapackager 查找自动模块
【发布时间】:2017-10-23 04:46:41
【问题描述】:

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

【问题讨论】:

  • 请使用完整的命令进行更新。另外,每个目录都是模块的目录。你的情况是这样吗?
  • 嗯,第二个目录有非模块罐子,但这是我的问题的一部分,对吧?我试图让它找到严格意义上实际上是非模块 jar 的自动模块。我知道-p 需要一个模块目录。这包括自动模块吗?
  • 理想情况下,人们会期望自动模块成为模块图的一部分,而无需您在模块路径参数中明确指定它。这样,模块化Jars 将具有包含自动模块并为它们增加可读性的声明。
  • 是的,我也预料到了。我的主模块 jar 对那些必要的非模块 jar 有明确的 requires 语句,但 javapackager 没有找到它们。

标签: java java-9 javapackager


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 GabeV。只是一个补充:如果不想执行建议的解决方法,甚至可以通过创建合适的module-info.java 来使第 3 方 jar 模块化,编译并将其放入 jar 中。然后,您可以将 jar 作为常规模块引用,javapackager 会很高兴。见stackoverflow.com/questions/47222226/…
  • 当然这只是另一种解决方法,但根据您的构建自动化设置,它可能更容易应用。
  • 是的,如果您没有太多 3rd 方库 jar,这是一个合适的解决方法。
【解决方案2】:

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

似乎一个插件报告说一个自动模块被用作 由于缺少module-info.class 资源而导致root! jlink应该 检测尝试使用自动模块作为 root 预先并报告 错误明显。

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

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

【讨论】:

  • jlink 一直拒绝自动模块。您链接到的最近的错误修复只是为了改进错误。我怀疑问题是 javapackager 没有报告原因(来自 jlink),所以错误被隐藏了。
  • @AlanBateman 异常似乎只是在自动模块的实现中,但消息似乎是伪装的 ..这也是我的意思,出于同样的原因添加了链接以添加隐藏错误的详细信息。我想我会把这个词改写为justified,也许这会造成混乱。
  • 正如我之前提到的,如果我指向 moduleJars 作为模块路径,我会得到一个不同的错误。它抱怨有问题的罐子不是模块罐子。似乎您不能将非模块 jar 放在该目录中。但是我又回到了我原来的问题:我如何让它找到自动模块?
  • 你是说设计上不可能使用自动模块还是这仍然是一个错误?链接的错误已修复,但直到 Java 10 才会出现。
  • 你说自动模块需要明确指定。我的问题是如何做到这一点。另外,当您说 ALL-MODULE-PATH 时,您指的是我系统上的 moduleJars 路径还是实际的关键字 ALL-MODULE-PATH?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2019-02-05
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多