How to create a fat jar for my JavaFX program?

Davide Perini perini.davide at dpsoftware.org
Mon Jul 20 22:56:09 UTC 2020


Done it here.

https://github.com/sblantipodi/JavaFastScreenCapture/blob/JavaFXJavaModule/pom.xml

If you read my sources there is how to configure the maven pom.
You need then create a simple class with a main that doesn't extends 
application that simply call the main in the class that extends application.

Hope it helped

In data 20 luglio 2020 21:25:23 Davide Perini 
<perini.davide at dpsoftware.org> ha scritto:

> PS: I add that I'm not new to maven,
> before java fx, I had a fat jar with gstreamer library, jna, and so on.
>
> the only problem I have is that it seems that I'm not able to bundle
> javafx with my fat jar.
>
>
>
> Il 20/07/2020 20.55, Davide Perini ha scritto:
>> I agree, don't want to download a JDK.
>> Is there a way to simply to it the old but good way using maven
>> assembly plugin or shade plugin?
>>
>> I am following this guide here:
>> https://openjfx.io/openjfx-docs/#modular
>>
>> I have done what they suggest in my pom file:
>>
>> <dependency> <groupId>org.openjfx</groupId>
>> <artifactId>javafx-controls</artifactId>
>> <version>${javafx.version}</version> </dependency> <dependency>
>> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId>
>> <version>${javafx.version}</version> </dependency> <dependency>
>> <groupId>org.openjfx</groupId>
>> <artifactId>javafx-graphics</artifactId> <version>14</version>
>> <classifier>win</classifier> </dependency>
>>
>>
>> <plugin> <groupId>org.openjfx</groupId>
>> <artifactId>javafx-maven-plugin</artifactId>
>> <version>${javafx.maven.plugin.version}</version> <configuration>
>> <mainClass>org.dpsoftware.FastScreenCapture</mainClass>
>> </configuration> </plugin> <plugin>
>> <groupId>org.apache.maven.plugins</groupId>
>> <artifactId>maven-assembly-plugin</artifactId> <configuration>
>> <outputDirectory>${project.build.directory}/</outputDirectory>
>> <finalName>JavaFastScreenCapture</finalName> </configuration>
>> <executions> <execution>
>> <id>make-executable-jar-with-dependencies</id> <phase>package</phase>
>> <goals> <goal>single</goal> </goals> <configuration> <archive>
>> <manifest> <addClasspath>true</addClasspath>
>> <mainClass>org.dpsoftware.FastScreenCapture</mainClass> </manifest>
>> </archive> <descriptorRefs>
>> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs>
>> </configuration> </execution> </executions> </plugin>
>>
>>
>> jar with dependencies says
>>
>> Error: JavaFX runtime components are missing, and are required to run
>> this application
>>
>>
>> still don't understand how to do it the right way.
>> I would like to do it with maven, is this possible?
>>
>> Thanks,
>> Davide
>>
>> Il 20/07/2020 20.26, Scott Palmer ha scritto:
>>> jlink and jdeps are module-based, so you do have to be careful.
>>> Neither will work properly when you try to run it against a
>>> non-modular project (found that out the hard way when Java 11 broke
>>> the world by removing the EE modules from Java SE and no modules were
>>> available to replace them), but you can use them to make a JRE image
>>> from a set of modules, such as those supplied by OpenJFX.
>>>
>>> I still think the .jmod files should be hosted by artifact
>>> repositories to make this work smoothly.  Downloading an SDK, seems
>>> so old-school when we have good dependency-management tools.
>>>
>>> Once you have a JRE image that includes JavaFX, then your application
>>> Jar files (all of them, no need to make anything 'fat') can easily be
>>> bundled with that JRE using jpackage.
>>>
>>> I have done Gradle scripts to do all that and it wasn’t difficult.
>>>
>>> Scott
>>>
>>>> On Jul 20, 2020, at 1:39 PM, Michael Paus <mp at jugs.org> wrote:
>>>>
>>>> In order to create a real platform installer with jpackage and
>>>> jlink/jdeps you don't have to use the java
>>>> module system at all. Have a look at this tutorial which I
>>>> co-autored together with Dirk Lemmermann:
>>>> <https://github.com/dlemmermann/JPackageScriptFX>
>>>> Michael
>>>>
>>>> Am 20.07.20 um 19:25 schrieb Davide Perini:
>>>>> Unfortunantly so few dependencies supports Java Modules this day,
>>>>> so fat JAR is the only way I can do it.
>>>>>
>>>>> Thanks
>>>>>
>>>>> Il 20/07/2020 02.50, Scott Palmer ha scritto:
>>>>>> The JavaFX classes are there, but what about the native libraries?
>>>>>>
>>>>>> A fat jar isn’t a good way to distribute a Java application these
>>>>>> days. Now you should probably be using jpackage and/or jlink to
>>>>>> bundle your application classes with a runtime suitable for
>>>>>> running the application.
>>>>>>
>>>>>> Scott
>>>>>>
>>>>>>> On Jul 19, 2020, at 5:32 PM, Davide Perini
>>>>>>> <perini.davide at dpsoftware.org> wrote:
>>>>>>>
>>>>>>> Hi all,
>>>>>>> thanks for the great project, I love JavaFX.
>>>>>>>
>>>>>>> I always used the maven plugin to crete fat jars with all my
>>>>>>> deps. The resulting jar is an executable one and ready to use.
>>>>>>>
>>>>>>> This is my pom that create the fat jar.
>>>>>>>
>>>>>>> but when I try to exceute the jar I get this error:
>>>>>>>
>>>>>>> Error: JavaFX runtime components are missing, and are required to
>>>>>>> run this appli
>>>>>>> cation
>>>>>>>
>>>>>>>
>>>>>>> if I explode the fat jar I can see that there are the javafx
>>>>>>> class in it. what am I doing wrong?
>>>>>>>
>>>>>>> Thanks
>>>>>>> Davide
>>>>>>>
>>>>>>> <plugin> <groupId>org.openjfx</groupId>
>>>>>>> <artifactId>javafx-maven-plugin</artifactId>
>>>>>>> <version>${javafx.maven.plugin.version}</version> <configuration>
>>>>>>> <mainClass>org.dpsoftware.FastScreenCapture</mainClass>
>>>>>>> </configuration> </plugin> <plugin>
>>>>>>> <groupId>org.apache.maven.plugins</groupId>
>>>>>>> <artifactId>maven-assembly-plugin</artifactId> <configuration>
>>>>>>> <outputDirectory>${project.build.directory}/</outputDirectory>
>>>>>>> <finalName>JavaFastScreenCapture</finalName> </configuration>
>>>>>>> <executions> <execution>
>>>>>>> <id>make-executable-jar-with-dependencies</id>
>>>>>>> <phase>package</phase> <goals> <goal>single</goal> </goals>
>>>>>>> <configuration> <archive> <manifest>
>>>>>>> <addClasspath>true</addClasspath>
>>>>>>> <mainClass>org.dpsoftware.FastScreenCapture</mainClass>
>>>>>>> </manifest> </archive> <descriptorRefs>
>>>>>>> <descriptorRef>jar-with-dependencies</descriptorRef>
>>>>>>> </descriptorRefs> </configuration> </execution> </executions>
>>>>>>> </plugin>
>>>>>>>
>>



More information about the openjfx-dev mailing list