Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a jlinked runtime be deployed with javapackager?

Tags:

javapackager

The instructions to javapackager just above Example 2-1 in the Java SE Deployment Guide/Self-Contained Application Packaging state that a jar file is required in the -deploy command.

If I use a modular jar, I get this error message:

Exception: java.lang.Exception: Error: Modules are not allowed in srcfiles: [dist\tcdmod.jar].

If I use the equivalent non-modular jar, the resulting package includes the complete runtime. But I want to use the reduced runtime I made with jlink that is in the /dist folder.

Can the javapackager command deploy with a jlink-generated runtime? How?

The section titled "Customization of the JRE" makes no mention of the javapackager command.

The following section "Packaging for Modular Applications" has a following line:

Use the Java Packager tool to package modular applications as well as non-modular applications.

Is the Java Packager tool distinct from javapackager? There are no examples using javapackager in this section.

Here is the javapacker command that I used:

javapackager -deploy -native -outdir packages -outfile ToneCircleDrone -srcdir dist -srcfiles tcdplain.jar -appclass com.adonax.tanpura.TCDLaunch -name "ToneCircleDrone" -title "ToneCircleDrone test"

The instructions in the javapackager documentation make no mention of the scenario where a jlink runtime is used. There is a Bundler argument -Bruntime but it is only used to point to an installed runtime other than the system default, AFAIK.

like image 413
Phil Freihofner Avatar asked May 16 '18 01:05

Phil Freihofner


1 Answers

The javapackager provided with JDK 9 and up uses jlink to generate the jre image:

For self-contained applications, the Java Packager for JDK 9 packages applications with a JDK 9 runtime image generated by the jlink tool. To package a JDK 8 or JDK 7 JRE with your application, use the JDK 8 Java Packager.

https://docs.oracle.com/javase/9/tools/javapackager.htm#JSWOR719

You can even pass arguments to jlink using -BjlinkOptions=<options>

Additionally, -Bruntime is only valid for packages deployed using -deploy -native jnlp

For compiling a modular application, instead of -srcdir, use --module-path <dir>, and then specify the main module using -m <module name>.

EDIT: While there is no documentation on -BjlinkOptions, it is present in the javapackager source

jdk.packager/jdk.packager.internal.legacy.JLinkBundlerHelper

https://github.com/teamfx/openjfx-10-dev-rt/blob/bf971fe212e9bd14b164e4c1058bc307734e11b1/modules/jdk.packager/src/main/java/jdk/packager/internal/legacy/JLinkBundlerHelper.java#L96

Example Usage: -BjlinkOptions=compress=2 will make javapackager run jlink with the --compress=2 flag, generating the JRE image with Zip Level compression.

Aditionally, running javapackager with the flag -Bverbose=true will show you exactly which arguments are being passed to jlink with a line in the output something like this:

userArguments = {strip-debug=1 compress=2}

like image 89
robot_rover Avatar answered Nov 11 '22 13:11

robot_rover