Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JavaFXSDK直接捆绑到输出jar中?_Java_Spring_Maven_Javafx_Libraries - Fatal编程技术网

如何将JavaFXSDK直接捆绑到输出jar中?

如何将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

目前,我在启动程序时使用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的插件部分非常简单。除了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>