假设我正在开发一个模块化应用程序,它由两个模块组成: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中。但是,如果我想构建一个JRE,它只包含足以运行我的应用程序和的JDK初始模块,那么必须知道JDK依赖项是什么(在示例中这只是java.base),并显式地指定它们,比如:
$ jlink --module-path /opt/jdk-9/jmods --add-modules java.base --output ~/custom-jre3有没有办法让jlink为我这么做?或者任何工具来为我找出那些JDK起源的依赖项?
发布于 2017-09-20 21:17:32
您可以使用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。默认情况下,除非指定了-include选项,否则将分析类路径和输入文件上的所有类.
2017年11月1日最新情况
有未来修订更改来使用与jlink相同的内容,如:
jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image发布于 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将它们定义为根模块。
在你的例子中:
$ 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-explorerhttps://stackoverflow.com/questions/46331306
复制相似问题