第 3 章 为模块化应用程序创建自定义 Java 运行时环境


您可以使用 jlink 工具从模块化应用程序创建自定义 Java 运行时环境。 安装 红帽构建的 OpenJDK 11 。 建议始终使用 可移植 tarball 作为 Jlink 的运行时基础。 使用 Logger 类创建一个简单的 Hello World 应用。 您有基础红帽构建的 OpenJDK 11 在 jdk-11 文件夹中:

$ ls jdk-11
bin  conf  demo  include  jmods  legal  lib  man  NEWS  release
$ ./jdk-11/bin/java -version
openjdk version "11.0.10" 2021-01-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.10+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode)
  • 为应用程序创建一个目录:

    $ mkdir -p hello-example/sample
  • 使用以下内容创建 hello-example/sample/HelloWorld.java 文件:

    package sample;
    import java.util.logging.Logger;
    public class HelloWorld {
        private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName());
        public static void main(String[] args) {
            LOG.info("Hello World!");
    							使用以下内容创建 hello-example/module-info.java 文件:
    						

    module sample
        requires java.logging;
    							编译应用程序:
    						

    $ ./jdk-11/bin/javac -d example $(find hello-example -name \*.java)
  • 在没有自定义 JRE 的情况下运行 您的应用程序:

    $ ./jdk-11/bin/java -cp example sample.HelloWorld
    Mar 09, 2021 10:48:59 AM sample.HelloWorld main
    INFO: Hello World!

    在这种情况下,OpenJDK 的基本构建需要 311 MB 来运行单个类。 (可选) 您可以检查红帽构建的 OpenJDK,并为您的应用程序查看许多非必需的模块:

    $ du -sh jdk-11/
    313M	jdk-11/
    $ ./jdk-11/bin/java --list-modules
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]
    [email protected]

    Hello World 应用示例存在非常少的依赖项。您可以使用 jlink 为应用程序创建自定义运行时镜像。这些镜像可帮助您只使用红帽构建的 OpenJDK 依赖项运行应用程序。 创建应用程序模块:

    $ mkdir sample-module
    $ ./jdk-11/bin/jmod create --class-path example/ --main-class sample.HelloWorld --module-version 1.0.0 -p example sample-module/hello.jmod
  • 使用所需模块创建自定义 JRE,并为您的应用程序创建自定义应用程序启动程序。

    $ ./jdk-11/bin/jlink --launcher hello=sample/sample.HelloWorld --module-path sample-module --add-modules sample --output custom-runtime
  • 列出生成的自定义 JRE 的模块。 请注意,只有一部分原始红帽构建的 OpenJDK 会保留。

    $ du -sh custom-runtime
    50M	custom-runtime/
    $ ./custom-runtime/bin/java --list-modules
    [email protected]
    [email protected]
    [email protected]
    注意

    自定义 java 运行时镜像的大小从 313M 运行时镜像减少到 50M 运行时镜像。 使用 hello launcher 启动应用。

    $ ./custom-runtime/bin/hello
    Jan 14, 2021 12:13:26 PM HelloWorld main
    INFO: Hello World!

    您的示例应用程序生成的 JRE 没有 java.base java.logging sample 模块以外的任何其他依赖项。 您可以在 custom-runtime 中发布与自定义运行时捆绑的应用程序。它包括您的应用程序。

  •