

FXApps: Creating Fat JARs for JavaFX Applications
source link: http://fxapps.blogspot.com/2020/11/creating-fat-jars-for-javafx.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Creating Fat JARs for JavaFX Applications
A FAT JAR is a type of Java application distribution where a single JAR contains all other dependencies, so no additional file is required to run the JAR besides the Java Virtual Machine.
For any Java maven based application, creating a FAR JAR could be solved by using Maven Shade Plugin. However, creating FAT Jars using JavaFX may be a challenge because JavaFX uses modules.
Fortunately this subject was intensely discussed in the WEB, and a good explanation and a solution was provided by Jose Pereda in this StackOverflow response.
In this post I want to briefly share the steps to make a FAT JAR and post an example on my github so I can point others to check the example.
How to create a FAT JAR for a JavaFX application?
1- Create a main class that will run your application. This class must have the main method and call your actual application static launch method;
2- Add the Shade Plugin to your project. For those using Gradle notice that Jose Pereda also provided an answer about it in Stack Overflow;
3- In the shade plugin configuration make sure you are setting the Main class to be the one created in step 1.
That's basically all you need. If i is not clear you can check my sample project in github. The three files, App.java, Main.java and pom.xml can be checked below.
package org.fxapps.javafx.fatjar;
import javafx.animation.Animation; import javafx.animation.FadeTransition; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.effect.InnerShadow; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.stage.Stage; import javafx.stage.StageStyle; import javafx.util.Duration;
public class App extends Application {
public static void main(String[] args) { launch(); }
@Override public void start(Stage stage) throws Exception {
var lblHello = new Label("Hello World!"); var fd = new FadeTransition(Duration.millis(900), lblHello);
// Label Setup lblHello.setFont(Font.font(Font.getDefault().getFamily(), FontWeight.BOLD, 60)); lblHello.setEffect(new InnerShadow()); lblHello.setTextFill(Color.GOLD); lblHello.setOnMouseClicked(e -> System.exit(0));
// Animation Setup fd.setAutoReverse(true); fd.setFromValue(1.0); fd.setToValue(0.2); fd.setCycleCount(Animation.INDEFINITE); fd.play();
stage.setScene(new Scene(new StackPane(lblHello))); stage.initStyle(StageStyle.UNDECORATED); stage.show();
}
}
package org.fxapps.javafx.fatjar;
// This is the Main used by the shade plugin. public class Main {
public static void main(String[] args) { App.main(args); } }
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.fxapps.javafx.fatjar</groupId> <artifactId>fatjar-javafx</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Fat Jar JavaFX</name> <description>Project to build a JavaFX 11+ Fat JAR.</description>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.release>11</maven.compiler.release> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <javafx.version>11.0.2</javafx.version> <javafx.plugin.version>0.0.4</javafx.plugin.version> <main.class>org.fxapps.javafx.fatjar.Main</main.class> </properties>
<dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-base</artifactId> <version>${javafx.version}</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>${javafx.version}</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>${javafx.version}</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>${javafx.plugin.version}</version> <configuration> <mainClass>${main.class}</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>${main.class}</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK