缺少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。