Distributing JavaFX 11 Application

Sverre Moe sverre.moe at gmail.com
Wed Feb 20 19:49:57 UTC 2019


You could use the new jpackage to create a native runtime of your
application.
The jpackager is now targeted for JDK 13, but can still be used to create a
native Java 11 application.

You can download an EA build of JDK 13 with jpackage
http://jdk.java.net/jpackage/

You would need to build on each platform, Linux, Windows, Mac.

You mentioned you use Maven. When Java 9 came out I had already moved over
to Gradle, so not familiar with the maven configuration.
Here is a Gradle task to create a Java 11 runtime using jlink with the Java
11 jmods

task createRuntime(type: Exec) {
    dependsOn installDist

    inputs.dir(installDist.outputs.files.singleFile)
    outputs.dir("${buildDir}/runtime")

    doFirst {
        delete "${buildDir}/runtime"
    }

    def libDir = new File(installDist.outputs.files.singleFile, "lib").path

    commandLine '/usr/java/jdk-11/bin/jlink',
        '--module-path', "/usr/java/jdk-11/jmods:${libDir}",
        '--add-modules', 'eu.yourmodule.application',
        '--output', "${buildDir}/runtime"
}

You then use this runtime with jpackage to create a native application
image or installer.

task createPackage(type: Exec) {
    dependsOn createRuntime

    commandLine '/usr/java/jdk-13/bin/jpackage', 'create-installer',
        '--verbose',
        '--force',
        '--name', project.name,
        '--app-version', project.version,
        '--module', "${mainClassName}",
        '--resource-dir', "${buildDir}/package",
        '--runtime-image', "${buildDir}/runtime",
        '--output', "${buildDir}/native"
}

/Sverre

Den ons. 20. feb. 2019 kl. 19:57 skrev Nicolas Therrien <
nicolas.therrien at motorolasolutions.com>:

> Hi!
>
> What is the proper way to create distributable packages of a JavaFx
> Application?
>
> I have a Java 11 application which I build as a module. The distribution
> includes a "modules" folder with all dependencies in it, and a script to
> launch the module.
>
> This assembly works if I build it on the same machine as I am going to be
> running it on. However, I realized that depending on which build agent the
> assembly is going to be created, the platform specific javafx dependencies
> may not match the target assembly. For example, if the build agent is a
> linux build agent, the windows and mac assembly contains linux javafx
> runtime.
>
> Maven will always pull the platform-specific libraries of the system it is
> running on.
>
> This was not a problem when JavaFx was part of the JDK since the correct
> runtime libraries were installed on the system already.
>
> What is the correct way to create a windows or linux package in a build
> platform independent way?
>
> I found an article which showed how to force maven to include all platforms
> as dependencies, but then I have to add dependency on each transitive
> library. Sounds like a lot of trouble for a simple task.
>
> How do you guys package your apps for various platforms?
>
> *Nicolas Therrien*
>
> Senior Software Developer
>
> *[image:
>
> https://www.motorolasolutions.com/content/dam/msi/images/logos/corporate/msiemailsignature.png]*
>
> *o*: +1.819.931.2053
>


More information about the openjfx-dev mailing list