【问题标题】:Creating custom runtime image dedicated for specific modular application创建专用于特定模块化应用程序的自定义运行时映像
【发布时间】:2017-09-20 20:33:01
【问题描述】:

假设我正在开发一个由 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 中。但是,如果我想构建一个 JRE,它只包含足以运行我的应用程序的 JDK 起源模块并且将我的应用程序模块分开,我必须知道我的 JDK 是什么依赖项是(在示例中这只是java.base)并明确指定它们:

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

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

【问题讨论】:

    标签: java java-9 jlink java-module jdeps


    【解决方案1】:

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

    jdeps --list-deps <path>
    

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

    其中&lt;path&gt; 可以是.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 日更新

    future revision 改成与jlink 一样使用:

    jlink --module-path jmods --add-modules $(jdeps --print-module-deps myapp.jar) --output image
    

    【讨论】:

      【解决方案2】:

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

      要改为仅包含 com.spacey.explorer 依赖的 JDK 模块,您首先需要确定这些模块,例如 with 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
      

      【讨论】:

        猜你喜欢
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 2018-07-03
        • 2021-03-14
        • 2015-07-20
        相关资源
        最近更新 更多