8

我想创建一个包含 3rd 方 jar 的 Java 9 运行时映像。我制作了一个简单的 Java 项目(我们称之为 this Example)来调用一个实用程序 jar(我们称之为 this 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

有没有办法使用不是模块的 jars 创建运行时映像?谢谢你。

4

2 回答 2

18

不,jlink 要求所有包含的模块都是显式的,这意味着它们需要有一个模块描述符。以下是文档中有关 jlink 模块路径的内容:

jlink 工具发现可观察模块的路径。这些模块可以是模块化 JAR 文件、JMOD 文件或分解模块。

请注意没有“普通 JAR”(即没有描述符的 JAR)。

不过,您可以将现有的第三方 JAR 升级为模块化 JAR(需要付出一些努力)。步骤是:

或者,您可以使用像ModiTect这样的工具来为您完成这些事情。

于 2018-01-24T08:23:01.303 回答
1

jlink直接不能这样做。诀窍是在所有外部库上调用 jdeps 以收集它们的系统模块依赖项,然后相应地修改参数以进行 jlink。生成 module-info.java 并不总能解决问题,但您可以使用 jdeps 查看您需要哪些系统模块,然后使用 jlink 创建自定义 Java 运行时,其中包含所有这些系统依赖项并将外部库放在类路径中或模块路径取决于它们是非模块化 jar 还是自动模块 jar。

您可以使用特殊的 Maven 插件之类的东西来自动执行该任务。

于 2019-02-03T12:04:31.013 回答