8

假设我正在开发一个由 2 个模块组成的模块化应用程序:com.spacey.explorer这取决于com.spacey.rocket模块。我在某个bin目录中有他们的模块化 JAR 文件。

我想准备轻量级 JRE 来运行它。很明显,我使用了jlink工具:

$ jlink --module-path /opt/jdk-9/jmods:../bin --add-modules com.spacey.explorer --output ~/custom-jre3

现在,当我在 JRE 中列出模块时,我得到以下信息:

$ java --list-modules 
com.spacey.explorer
com.spacey.rocket
java.base@9

也就是说,我的应用程序模块被捆绑到 JRE 中。但是,如果我想构建一个仅包含 JDK 起源的模块的 JRE,这些模块足以运行我的应用程序并将我的应用程序模块分开,我必须知道我的 JDK 依赖项是什么(在示例中这只是java.base)并明确指定它们喜欢:

$ jlink --module-path /opt/jdk-9/jmods --add-modules java.base --output ~/custom-jre3

有什么方法可以让jlink为我做这件事吗?或者任何可以为我找出那些源自 JDK 的依赖项的工具?

4

2 回答 2

9

您可以使用jdeps工具。可以提供帮助的选项是:

jdeps --list-deps <path>

列出JDK内部API的依赖和使用。

其中<path>可以是 .class 文件、目录、JAR 文件的路径名。

注意jdeps -help用于列出所有选项及其语法。您可以使用


例如,我尝试了我的机器 .m2 文件夹中的一个 jar 文件,该文件将被视为一个未命名的模块,例如:

jdeps --list-deps /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

输出::

java.base
java.desktop
unnamed module: /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

您还可以使用

jdeps --jdk-internals --class-path <path> <path>

查找对 JDK 内部 API 的类级别依赖性。默认情况下,它会分析 --class-path 和输入文件中的所有类,除非指定了 -include 选项。


2017 年 11 月 1 日更新

将来会有修订更改以使用与jlinkas 相同的内容:

jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image
于 2017-09-20T21:17:32.107 回答
6

要创建运行时映像,jlink您需要指定根模块--add-modules- 从这些模块开始,jlink 将构建模块图并将所有已解析的模块包含在新映像中。您已经使用了--add-modules com.spacey.explorer,因此jlink包括com.spacey.explorer及其所有依赖项。

要仅包含com.spacey.explorer所依赖的 JDK 模块,您首先需要确定这些模块,例如使用 jdeps(另请参见nullpointer's answer)。一旦你知道了这些模块,你就可以将它们定义为根模块,使用--add-modules.

在您的示例中:

$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base
    --output ~/custom-jre-for-explorer

如果有更多的模块不仅仅是java.base,比如java.sql,命令将如下所示:

$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base,java.sql
    --output ~/custom-jre-for-explorer
于 2017-09-20T21:53:05.987 回答