Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JDK11/JavaFX: How do I make a fat jar without build/depdency management?

I think it goes without saying that I should be able to use Oracle's own JDK with JavaFX (from gluonhq) to build a distributable jar file that users can just USE.

After an exhaustive search, much reading (24 hours or more over the last few months)and finally this Google search query:

how to make a fat jar -maven -gradle -scala -eclipse -ant -docker -hadoop -netbeans -jerkar -phy -mozni -yogurt -pizza - throwing -python -bacon

I'm absolutely at the end of the road. Why on earth is this so much work? How can I build a JavaFX application and give it to people that want to actually use it without knowing anything else except how to use the application itself?

like image 413
chrips Avatar asked Mar 22 '19 13:03

chrips


People also ask

Does JavaFX run on JDK 11?

In Java 11, JavaFX was removed from the SDK. It is now in its own separate module, and if you want to use it in your application you will need to specifically include it.

Is JavaFX platform independent?

Written in Java − The JavaFX library is written in Java and is available for the languages that can be executed on a JVM, which include − Java, Groovy and JRuby. These JavaFX applications are also platform-independent.

Does Java 16 have JavaFX?

Or you can download the JavaFX/OpenJFX libraries, placing them in a folder where they will be detected by Java, “on the classpath” as we say. Java 16 and JavaFX/OpenJFX 16 are current, but both are only supported until their versions 17 arrives later this year in September 2021.


1 Answers

This has been answered a few times already for Maven and Gradle. Build tools make things way easier than doing it on command line, and not only because of the dependency management.

Since you ask specifically about command line, there is already a full set of instructions documented for it here: https://openjfx.io/openjfx-docs/#modular.

Non modular App

The section Non-Modular from CLI covers JavaFX non-modular projects from command line, and gives you the whole set of instructions to create an old classic fat jar, where all the dependencies, including the JavaFX ones, are bundled all together.

There is a note that warns you not to use this procedure:

Warning: This is a discouraged tedious error-prone manual process that should be avoided by using the Maven's shade plugin or the Gradle's jar task, in case jlink is not applicable.

After you get the fat jar (it can be cross-platform), you can distribute it, and your user will need to have Java installed and run:

java -jar myFat.jar 

Modular App

The section Modular from CLI covers JavaFX modular projects from command line, and refers to the use of the jlink command, in terms of distribution, as it creates a custom image that you can send to your users. It is not a fat jar, but it will allow you sending a zip to your user that needs only to be unzipped and run like:

hellofx/bin/java -m hellofx/hellofx.HelloFX

In this case your user won't even need to have Java installed.

And with a little bit of extra work you can also create a batch, so you can run:

hellofx

However, if you still want to do a fat jar with a modular app, you can still apply the exact same instructions from the non-modular apps. In this case, you will probably have to remove the module-info.java file, as it doesn't really makes sense at this point.

Other options

You still have a few more options to distribute your application.

Custom Java+JavaFX image

Another option, covered in the same document, section Custom JDK+JavaFX image, explains how to create your own "JDK" that includes JavaFX. Then you will produce your jar as usual in Java 8 and you will be able to run it with:

/path/to/custom/java -jar myFat.jar

Note that there are already some JDK distributions that bundle JavaFX, like this one.

jpackage

jpackage tool is not there yet, but there is an early access: http://jdk.java.net/jpackage/, that is using Java 13-internal. The exiting documentation explains what are the command line options you need to produce a custom image or an installer.

Note that you can still use JavaFX 11 or 12 with this.

Build tools

And finally, you can still decide to use build tools (Maven or Gradle), that will really help you in many ways. See any of the linked questions above.

like image 174
José Pereda Avatar answered Oct 21 '22 12:10

José Pereda