使用第三方 jar 使用 JLink 生成运行时映像



我想创建一个包含第三方jar的Java 9运行时映像。我做了一个简单的Java项目(我们称之为Example(来调用实用程序jar(我们称之为ExampleUtil.jar(。 Example 包含 src 目录中的module-info.java,并且在 Eclipse 中运行良好(我已添加ExampleUtil.jar作为模块依赖项(。

如果我打电话:

jlink -v
    --module-path "C:Program FilesJavajdk-9.0.4jmods";C:Temp
    --add-modules com.example.steven
    --output C:Tempimage.steven
    --launcher launch=com.example.steven/com.example.steven`

。我收到错误消息:

错误:找不到示例实用程序模块的模块信息.class

有没有办法使用不是模块的 jar 创建运行时映像?

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

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

请注意,没有"普通 JAR"(即没有描述符的 JAR(。

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

  • 获取 JAR 及其所有依赖项
  • 为其创建module-info.java(手动或使用 JDeps(
  • 将其编译为module-info.class --patch-module告诉编译器有关源代码的信息
  • 使用 jar --update 将模块声明添加到现有 JAR

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

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

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

最新更新