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> |
Comentários
Postar um comentário