如何将JavaFXSDK直接捆绑到输出jar中?
目前,我在启动程序时使用JVM参数查找JavaFX库,如下所示:如何将JavaFXSDK直接捆绑到输出jar中?,java,spring,maven,javafx,libraries,Java,Spring,Maven,Javafx,Libraries,目前,我在启动程序时使用JVM参数查找JavaFX库,如下所示: java -javaagent:lib/aspectjweaver-1.9.5.jar -javaagent:lib/spring-instrument-5.2.3.RELEASE.jar --module-path lib/javafx-sdk-13.0.2/lib --add-modules=javafx.controls -jar target/Some_Service-1.0.jar xml的插件部分非常简单。除了Doc
java -javaagent:lib/aspectjweaver-1.9.5.jar -javaagent:lib/spring-instrument-5.2.3.RELEASE.jar --module-path lib/javafx-sdk-13.0.2/lib --add-modules=javafx.controls -jar target/Some_Service-1.0.jar
xml的插件部分非常简单。除了Docker和Launch4j插件之外,我只有以下几个:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
org.springframework.boot
我现在所需要的就是以某种方式将JavaFX运行时捆绑到我的jar中,而不是使用命令行参数从外部引用它。警告:由于fat/uber jar可能会导致JavaFX被放置在类路径上,请注意这种方法
不要使用JavaFXSDK,而是在pom.xml
文件中声明您对JavaFX的依赖。然后您可以使用创建一个可执行的fat/uber JAR。从Maven Central下载的相应JavaFX JAR(例如图形JAR文件)嵌入了所需的特定于平台的本机代码,这些代码将在运行时提取(例如,提取到用户主目录)
下面是一个简单的例子:
Launcher.java:
package.com.example;
导入javafx.application.application;
公共类启动器{
公共静态void main(字符串[]args){
应用程序启动(App.class,args);
}
}
App.java:
package.com.example;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类应用程序扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
StackPane root=新的StackPane(新标签(“你好,世界!”);
原始阶段。设置场景(新场景(根,500300));
primaryStage.show();
}
}
pom.xml:
4.0.0
com.example
有关如何创建跨平台uber JAR的想法
根据开发应用程序所使用的Java版本,您可以查看jlink
(Java 9+)和/或jpackage
(Java 14,早期访问)作为创建fat/uber JAR文件的替代方案。如果使用其中一个,考虑使用JavaFX文件(can be),因为它配置自定义图像以更好地处理本机代码(即没有提取)。
请注意,主类不是Application
的子类。这对于将JavaFX库放在类路径上的应用程序是强制性的,至少对于JavaFX9-13是这样。此要求的原因与允许JavaFX应用程序没有主方法的实现有关;如果javafx.graphics
模块不在模块路径上,则假定“缺少javafx组件”。但是,只有当主类和应用程序
类相同时才会发生这种情况,因此上述解决方法是。try的问题是,这不是项目依赖关系。这些是maven不知道的外部文件,只在运行时提供。到底缺少哪些文件?回答第一个问题,这些文件不是maven作为依赖项提供的,它们是与openJDK(openJFX)分开提供的。这些文件过去直接捆绑在JRE中,但从Java 11开始就不再是了,因此必须以这种方式引用它们。SDK不是必需的。Maven Central中的构件包含您需要的所有代码(包括特定于平台的本机代码,在运行时提取)。如果主类是应用程序
实现,并且从类路径使用javafx.graphics
模块,则也可能会发生此错误。如果使用类路径中的所有内容(可能是胖jar),那么您的主类不能是应用程序的子类。请参阅(特别是编辑)和我在上一篇评论中链接到的答案。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>lib</folder>
</folders>
<agent>lib/aspectjweaver-1.9.5.jar</agent>
<agent>lib/spring-instrument-5.2.3.RELEASE.jar</agent>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>