首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用javapackager查找自动模块

如何使用javapackager查找自动模块
EN

Stack Overflow用户
提问于 2017-10-23 12:46:42
回答 2查看 1.9K关注 0票数 5

我使用javapackager捆绑了一个应用程序,其中的主jar是一个带有module-info.class的模块,但它依赖于许多其他jar,这些jar都是普通的老式jar,所以我在module-info.java中将它们称为自动模块。然而,javapackager抱怨说找不到它们。如何让它找到自动模块的jar文件?

代码语言:javascript
复制
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):

代码语言:javascript
复制
/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
EN

回答 2

Stack Overflow用户

发布于 2017-10-25 02:51:05

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

因此,在甲骨文和Java社区决定如何处理这个问题之前,Java9中的javapackager不会让您使用自动模块。如果您捆绑了一个使用模块的应用程序,那么您的所有依赖项也必须是模块。如果您需要非模块依赖关系,那么您必须使所有jars都是非模块的。如果您确实使您的jar模块化,那么您必须使您的所有依赖项模块化,这可能是大量的工作,或者如果您不拥有这些依赖项,这是不可能的。

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

票数 6
EN

Stack Overflow用户

发布于 2017-10-23 14:23:23

进一步看,这个例外似乎在自动模块上的实现中是合理的,但该消息似乎掩盖了中所述的信息。

似乎有一个插件报告说,由于缺少module-info.class资源,某个自动模块被用作根目录!jlink应该预先检测到试图使用自动模块作为根目录的行为,并明确报告错误。

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

附加说明:Java packaging tools(javapackager)使用jlink工具为应用程序生成自定义的jlink

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46882108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档