will
will

Reputation: 5081

a method to build an executable JavaFX Jar from Maven Archetype

I want to be set an archetype for a stable JavaFX (Java 8) Maven build that will produce an executable JAR that (always) runs from the command line. And preferable without needing to build an UberJar or similar.

When we use the Netbeans 'Maven JavaFX' archetype the resultant JAR file following a build runs. As a project grows we find that sometimes the JAR won't run from the command line. Some Maven POM edits have been needed to 'encourage' the program to run from the command line again. This applies to Linux and Windows.

This also happens directly with the ZenJava JavaFX archetype, e.g. a project artifactId=xx:

 java -jar target\xx.jar
 no main manifest attribute, in target\xx.jar

This is just from the mavan generate command. The details of the two archetypes in question are:

zenjava

netbeans

Comparing the resulting POM files shows these that the codehaus.mojo (netbeans) uses these plugins in the build:

Either project runs happily from within Netbeans IDE. The challenges occur when we want to test on command line. It isn't really the best look externally when the build looks unstable to outsiders like that.

The questions arising are about what are the requirements to make a JavaFX command-line executable JAR file? For JDK 8 and beyond.

  1. Is there an alternative JavaFX archetype available that will build projects with dependent JAR-s and run from the command line?

  2. What allows Netbeans (say) to execute JAR when the same the built JAR won't run on the command-line?

    • What 'magic' does Netbeans be add to the execute step?
  3. What is needed for the zenjava archetype to run "Java -jar"?

    • The JAR resulting from the follow steps doesn't run on the console.
    • mvn archetype:generate -DarchetypeGroupId=com.zenjava -DarchetypeArtifactId=javafx-basic-archetype ... -DartifactId=xx
    • mvn install
    • java -jar target/xx-001.jar
  4. What influences the: maven-dependency-plugin and maven-compiler-plugin when building the JAR for bigger projects?

    • In other words, what assumptions might be being broken a project grows and bind with other JAR files.

Needless to say, the Maven generate and build steps are using the JDK Java environment. The execution though, java -jar target/xx-001.jar, need to run under the simple JRE (without the JDK). I guess question #4 is a long stretch unless you are someone who has a biggish JavaFX project and solved this already. Suggestions welcome.

Upvotes: 0

Views: 1544

Answers (1)

FibreFoX
FibreFoX

Reputation: 2858

just to mention: I'm the maintainer of the javafx-maven-plugin (and the archetype).

To answer your question 3:

You have to call the GENERATED jar-file from the plugin, which is located at target/jfx/app/yourapp.jar

The generated jar-file will reference all required dependencies, which are noted inside the META-INF/MANIFEST.MF-file inside it. While creating that jar-file, the pom is scanned for runtime-dependencies, these will be placed at the target/jfx/app/lib-folder. When bundling your app into native bundle, the JRE is put aside of the generated launcher under the target/jfx/native/-folder.

What confuses me about your problem: mixing CLI- and GUI-application might result in problems, but i guess it's just your special requirement :)

EDIT: Calling mvn install does NOT generate jfx-jar without special configuration, you have to call mvn jfx:jar or mvn jfx:native to call the MOJOs of the plugin. For easier configuration, please visit our configuration-website: http://javafx-maven-plugin.github.io/

Upvotes: 1

Related Questions