首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建专用于特定模块应用程序的自定义运行时映像

创建专用于特定模块应用程序的自定义运行时映像
EN

Stack Overflow用户
提问于 2017-09-20 20:33:01
回答 2查看 1.6K关注 0票数 8

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

我想准备轻量级的JRE来运行它。因此,显然,我使用了jlink工具:

代码语言:javascript
复制
$ jlink --module-path /opt/jdk-9/jmods:../bin --add-modules com.spacey.explorer --output ~/custom-jre3

现在,当我在JRE中列出模块时,会得到以下内容:

代码语言:javascript
复制
$ java --list-modules 
com.spacey.explorer
com.spacey.rocket
java.base@9

也就是说,我的应用程序模块被绑定到JRE中。但是,如果我想构建一个JRE,它只包含足以运行我的应用程序的JDK初始模块,那么必须知道JDK依赖项是什么(在示例中这只是java.base),并显式地指定它们,比如:

代码语言:javascript
复制
$ jlink --module-path /opt/jdk-9/jmods --add-modules java.base --output ~/custom-jre3

有没有办法让jlink为我这么做?或者任何工具来为我找出那些JDK起源的依赖项?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 21:17:32

您可以使用jdeps工具。可供选择的办法是:

代码语言:javascript
复制
jdeps --list-deps <path>

列出JDK内部API的依赖关系和使用情况。

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

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

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

代码语言:javascript
复制
jdeps --list-deps /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

输出::

代码语言:javascript
复制
java.base
java.desktop
unnamed module: /.m2/repository/org/apache/commons/commons-lang3/3.6/commons-lang3-3.6.jar

您还可以使用

代码语言:javascript
复制
jdeps --jdk-internals --class-path <path> <path>

查找类级依赖于JDK内部API。默认情况下,除非指定了-include选项,否则将分析类路径和输入文件上的所有类.

2017年11月1日最新情况

未来修订更改来使用与jlink相同的内容,如:

代码语言:javascript
复制
jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image
票数 9
EN

Stack Overflow用户

发布于 2017-09-20 21:53:05

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

要想只包含com.spacey.explorer所依赖的JDK模块,您首先需要确定这些模块,例如用jdeps (也请参阅空指针的答案)。一旦了解了这些模块,就可以使用--add-modules将它们定义为根模块。

在你的例子中:

代码语言:javascript
复制
$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base
    --output ~/custom-jre-for-explorer

如果有比java.base更多的模块,比如java.sql,那么命令如下所示:

代码语言:javascript
复制
$ jlink 
    --module-path /opt/jdk-9/jmods
    --add-modules java.base,java.sql
    --output ~/custom-jre-for-explorer
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46331306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档