我想创建一个包含第 3 方 jar 的 Java 9 运行时映像。我制作了一个简单的 Java 项目(让我们称之为
Example
)来调用实用程序 jar(让我们称之为 ExampleUtil.jar
)。 Example
包含 module-info.java
目录中的 src
,并且在 Eclipse 中运行良好(我已添加 ExampleUtil.jar
作为模块依赖项)。
如果我打电话:
jlink -v
--module-path "C:\Program Files\Java\jdk-9.0.4\jmods";C:\Temp
--add-modules com.example.steven
--output C:\Temp\image.steven
--launcher launch=com.example.steven/com.example.steven`
...我收到错误消息:
错误:找不到ExampleUtil模块的module-info.class
有没有办法使用非模块的 jar 文件创建运行时映像?
不,jlink 要求所有包含的模块都是“显式”的,这意味着它们需要有一个模块描述符。以下是文档关于 jlink 模块路径的说明:
jlink工具发现可观察模块的路径。这些模块可以是模块化 JAR 文件、JMOD 文件或分解模块。请注意缺少“普通 JAR”(即没有描述符的 JAR)。
不过,您可以将现有的第三方 JAR 升级为模块化 JAR(需要付出一些努力)。步骤是:
获取 JAR 及其所有依赖项
module-info.java
module-info.class
与
--patch-module
告诉编译器有关来源的信息
使用 jar --update
您可以使用特殊的 Maven 插件之类的东西来自动执行该任务。
看到解释。您可以使用 jdeps 命令查找 jvm 模块,它可以分析模块和类路径。示例
jdeps --module-path <your modul path> -cp <your classpath> -m <your root module> --list-deps
此示例适用于您的主 jar 是模块的情况,但这不是必需的。 获得模块列表后,您可以像这样创建运行时 jre 映像
jlink --no-header-files --no-man-pages --add-modules <modules list you get from jdeps> --output <output dir>
现在我不确定从理论角度来看是否可以保证 jdeps 可以从类路径“常规”jar 中找到所需的模块。我猜在某些情况下可能会丢失,所以结果需要测试,但是丢失模块的错误是明确的,你可以将其添加到jlink列表中。