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

时间:2019-01-16 00:31:23

标签: java jlink

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

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

如何将启动器可执行文件配置为预先配置为使用或以其他方式接受VM选项?无法直接在命令行上指定它们。

2 个答案:

答案 0 :(得分:3)

您可以使用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(包括添加选项):https://docs.oracle.com/en/java/javase/12/tools/jlink.html

答案 1 :(得分:0)

有一种或两种方法可以解决此问题,但是大多数情况下,我将专注于默认的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在模块中指定主类

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创建自定义启动器/编辑JDK_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在module-info中指定主类描述符:

<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>