创建专用于特定模块化应用程序的自定义运行时映像
Creating custom runtime image dedicated for specific modular application
假设我正在开发一个由 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 产生的依赖关系?
您可以使用 jdeps 工具。可能有帮助的选项是:
jdeps --list-deps <path>
Lists the dependences and use of JDK internal APIs.
其中 <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>
Finds class-level dependences on JDK internal APIs. By default, it analyzes all classes on --class-path and input files unless -include option is specified.
2017 年 11 月 1 日更新
有 future revision 更改以使用与 jlink
相同的方式:
jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image
要使用 jlink
创建运行时映像,您需要使用 --add-modules
指定根模块 - 从这些模块开始,jlink 将构建模块图并将所有已解析的模块包含在新映像中.您使用了 --add-modules com.spacey.explorer
,因此 jlink
包括 com.spacey.explorer 及其所有依赖项。
要改为仅包含 JDK 模块 com.spacey.explorer 取决于,您首先需要确定这些模块,例如 with jdeps (see also )。了解这些模块后,您可以使用 --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
假设我正在开发一个由 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 产生的依赖关系?
您可以使用 jdeps 工具。可能有帮助的选项是:
jdeps --list-deps <path>
Lists the dependences and use of JDK internal APIs.
其中 <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>
Finds class-level dependences on JDK internal APIs. By default, it analyzes all classes on --class-path and input files unless -include option is specified.
2017 年 11 月 1 日更新
有 future revision 更改以使用与 jlink
相同的方式:
jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image
要使用 jlink
创建运行时映像,您需要使用 --add-modules
指定根模块 - 从这些模块开始,jlink 将构建模块图并将所有已解析的模块包含在新映像中.您使用了 --add-modules com.spacey.explorer
,因此 jlink
包括 com.spacey.explorer 及其所有依赖项。
要改为仅包含 JDK 模块 com.spacey.explorer 取决于,您首先需要确定这些模块,例如 with jdeps (see also --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