On 21/10/2022 18:04, Thomas Reinhardt wrote:
I think there is a misunderstanding here.
What I want is basically create a zip that contains all needed jars
and run my application via "java -jar myapp.jar". Of course there
exists a proper exe for windows users etc but thats besides the point.
The one thing the whole discussion is about is that I want to use the
same zip for all supported platforms (linux and windows in my case).
What I specifically NOT want is platform dependent zips. We have a
very large number of dependencies and the size of the whole thing
(zipped) is about 300MB. Having os specific versions would basically
double that size for our nexus instance, the download server etc.
This is exactly how I package my stuff. You get a jar, with everything
in it which runs on all the platforms.
I include these dependencies in Maven, AFAIK the rest isn't platfrom
dependent:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<classifier>win</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<classifier>linux</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<classifier>mac</classifier>
</dependency>
Then just package the whole bunch with the shade plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hs.mediasystem.local.client.NonJavaFXFrontEndRunner</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
This yields a fat jar. When you unzip it, all JavaFX classes, all
native libraries etc. are included, and it runs without any special
command line arguments.
To be clear: the whole thing has to run on the classpath and is not
modularized (yet). Not what we want but what other dependencies are
forcing us to do.
Nor is mine, and I never intend to modularize it, and it will never be
needed as long as there are source files.
I even use this to avoid the modularize startup that JavaFX seemingly
enforces:
public class NonJavaFXFrontEndRunner {
public static void main(String[] args) {
FrontEndRunner.main(args); // Workaround for javafx.graphics
named module check when bundled as fat jar
}
}
Where FrontEndRunner has another main entry point which implements
Application:
public class FrontEndRunner extends Application {
public static void main(String[] args) {
System.setProperty("prism.lcdtext", "false");
Application.launch(args);
}
If I read the source correctly, the javafx-maven-plugin can either run
the application on my dev machine (why?) or create platform dependent
runtime images.
Am I missing something?
Seriously, isn't the sole existence of this plugin an indicator that
something is not quite right?
I'm not sure what, I never needed this plugin, and I agree, needing a
specific plugin for a dependency would be odd, but turns out you don't
need it :)
--John