如何为 JLink 启动器可执行文件设置 VM 选项

How to set VM options for JLink launcher executable

使用jlink时,会生成一个bin/java文件。此可执行文件将通过以通常方式在命令行上指定选项(例如 -Dsystem.property=value-Xmx1G)来接受 VM 选项。

jlink 还提供了一个 --launcher 选项来创建可以直接 运行 的可执行文件,而不必使用模块名称调用 bin/java 可执行文件。

如何使启动器可执行文件预先配置为使用我选择的 JVM 选项?

有一种或两种方法可以解决这个问题,但我主要关注默认的 java 方法。

实际答案 - 使用 JPackage。 JLink 只是一个运行时的映像。 JPackage 是您的可分发文件

Support for native packaging formats to give the end user a more natural installation experience. Specifically, the tool will support the following formats:

    Windows: msi, exe
    macOS: pkg, app in a dmg (drag the app into the Applications directory)
    Linux: deb, rpm

The application will be installed in the typical default directory for each platform unless the end-user specifies an alternate directory during the installation process (for example, on Linux the default directory will be /opt).

The ability to specify JDK and application arguments at packaging time that will be used when launching the application

The ability to package applications in ways that integrate into the native platform, for example:

    Setting file associations to allow launching an application when a file with an associated suffix is opened
    Launching from a platform-specific menu group, such as Start menu items on Windows
    Option to specify update rules for installable packages (such as in rpm/deb)


1) - 指定一个@Args 文件

您可以制作一个可以与您的 jlink 应用程序部署(捆绑)的 @args 文件,并在启动应用程序时引用它

java @args -m module/main

2) 使用新的环境变量

JDK_JAVA_OPTIONS=--add-opens java.base/java.lang=...... -Xmx1G -Djdk.logging.provider=

https://docs.oracle.com/javase/9/tools/java.htm#JSWOR624

3) 使用JLink/JMod在模块

中指定main class

https://maven.apache.org/plugins/maven-jmod-plugin/plugin-info.html

      <plugin>
        <artifactId>maven-jmod-plugin</artifactId>
        <version>3.0.0-alpha-1</version>
        <extensions>true</extensions>
        <configuration>
          <module>
          <mainClass>mainClass</mainClass>
        </configuration>
      </plugin>

4) 使用JLink创建自定义launcher/EditJDK_VM_OPTIONS

<plugin>
                        <artifactId>maven-jlink-plugin</artifactId>
                        <version>3.0.0-alpha-2-SNAPSHOT</version>
                        <extensions>true</extensions>
                        <configuration>
                            <noHeaderFiles>true</noHeaderFiles>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <verbose>true</verbose>
                            <compress>2</compress>
                            <launcher>customjrelauncher=module/mainClass</launcher>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>org.ow2.asm</groupId>
                                <artifactId>asm</artifactId>
                                <version>${maven.asm.version}</version>
                            </dependency>
                        </dependencies>
                    </plugin>

在生成的 .sh/.bat 中有一个变量来指定任何自定义插件的

如果您正在使用 moditect,您还可以在模块信息中指定主要 class 描述符:

<plugin>
                <groupId>org.moditect</groupId>
                <artifactId>moditect-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>add-module-infos</id>
                        <phase>package</phase>
                        <goals>
                            <goal>add-module-info</goal>
                        </goals>
                        <configuration>
                            <overwriteExistingFiles>true</overwriteExistingFiles>
                            <module>
                                <mainClass>mainClassLocation</mainClass>
                            </module>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

您可以使用 add-options jlink 插件。

例如,如果你想设置Xmx:

jlink --add-options="-Xmx100m" ...

要查看 jlink 插件列表,运行 jlink --list-plugins

add-options 插件当前文档(JDK14)如下:

Plugin Name: add-options
Option: --add-options=<options>
Description: Prepend the specified <options> string, which may include
whitespace, before any other options when invoking the virtual machine
in the resulting image.

请注意,某些插件显然是 unstable (including add-options): https://docs.oracle.com/en/java/javase/12/tools/jlink.html