缺少Maven Shade JavaFX运行时组件

我正在尝试使用maven依赖项创建一个JFX11自包含jar。 从我所做的研究来看,似乎最好的方法是通过maven shade插件。 但是,当我运行它时,我收到此错误:

错误:缺少JavaFX运行时组件,并且需要运行此应用程序

我不明白为什么会这样。 我搞砸了什么? 有一个更好的方法吗? 我也尝试过使用相同消息的maven程序集插件。

pom文件供参考

 4.0.0 Application Main jar 1.0-SNAPSHOT SpaceRunner http://maven.apache.org   org.openjfx javafx-controls 11      org.apache.maven.plugins maven-compiler-plugin 3.8.0  10    org.codehaus.mojo exec-maven-plugin 1.6.0    java     Application.Main    maven-jar-plugin     Application.Main       org.apache.maven.plugins maven-shade-plugin 3.2.0   package  shade     Application.Main          

这个答案解释了为什么fatF / Uber jar在JavaFX 11上出现故障。简而言之:

此错误来自java.base模块中的sun.launcher.LauncherHelper。 原因是Main应用程序扩展了Application并有一个主要方法。 如果是这种情况,LauncherHelper将检查javafx.graphics模块是否作为命名模块存在。 如果该模块不存在,则中止启动。

并且已经为Gradle提出了一个修复方案。

对于Maven,解决方案完全相同:提供一个不从Application扩展的新主类。

您将在application包中使用新类(错误名称):

 // NewMain.java public class NewMain { public static void main(String[] args) { Main.main(args); } } 

和你现有的Main类一样,原样如下:

 //Main.java public class Main extends Application { @Override public void start(Stage stage) { ... } public static void main(String[] args) { launch(args); } } 

现在您需要修改您的pom并为不同的插件设置主类:

 application.NewMain 

特定于平台的胖jar

最后,使用阴影插件,您将在您的机器上生产一个胖jar。

这意味着,到目前为止,您的JavaFX依赖项正在使用唯一的分类器。 例如,如果你在Windows上,Maven将在内部使用win分类器。 这具有仅包括Windows的本机库的效果。

所以你正在使用:

  • org.openjfx:JavaFX的控制:11
  • org.openjfx:JavaFX的控制:11:胜
  • org.openjfx:JavaFX的图形:11
  • org.openjfx:javafx-graphics:11:win < - 这包含Windows的本机dll
  • org.openjfx:JavaFX的底座:11
  • org.openjfx:JavaFX的基础:11:胜

现在,如果您生成fat jar,您将捆绑所有这些依赖项(以及项目中的其他常规第三方依赖项),并且您将能够以下列方式运行项目:

 java -jar myFatJar-1.0-SNAPSHOT.jar 

虽然这非常好,如果你想分发你的jar,请注意这个jar 不是跨平台的,它只能在你的平台上工作,在这种情况下是Windows。

跨平台脂肪jar

有一个解决方案可以生成一个可以分发的跨平台jar:包括其他平台的其他本机库。

这很容易完成,因为您只需要包含三个平台的图形模块依赖项:

   org.openjfx javafx-controls 11   org.openjfx javafx-graphics  11 win   org.openjfx javafx-graphics  11 linux   org.openjfx javafx-graphics  11 mac   

尺寸

这种方法存在一个主要问题:尺寸。 正如您在其他答案中所看到的,如果使用WebView控件,由于WebKit本机库,您将捆绑大约220 MB。