使用时jlink
,会生成一个bin/java
文件。这个可执行文件将通过在命令行上以通常的方式(例如-Dsystem.property=value
或-Xmx1G
)指定选项来接受 VM 选项。
jlink
还提供了一个--launcher
选项来创建可以直接运行的可执行文件,而不必bin/java
使用模块名称调用可执行文件。
如何使启动器可执行文件预先配置为使用我选择的 JVM 选项?
您可以使用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.
请注意,某些插件显然不稳定(包括添加选项):https ://docs.oracle.com/en/java/javase/12/tools/jlink.html
有一种或两种方法可以解决这个问题,但主要是我将专注于默认的 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 在模块信息中指定主类描述符:
<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>