我正在使用 Java 8
与 JavaFX
.当我打包我的可执行文件时 JAR
与 maven
, 可执行文件 JAR
使用 Java 8
工作正常.但是,如果我运行 JAR
与例如Java 13
,我收到以下错误:
Error: Could not find or load main class ApplicationLauncherClient
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
这大概是由
JavaFX
引起的未与 JRE
捆绑在一起/JDK
自从 Java 11
.我的
pom.xml
构建配置如下所示:<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>ApplicationLauncherClient</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
我的目标是指导
maven
建一个JAR
可以在任何 Java
上运行版本大于或等于 8,包括 JavaFX
在可执行文件中 JAR
.我没有按照 this 中的说明成功回答(例如,将
JavaFX
插件添加到我的 pom.xml
中)。 Including OpenJFX
as dependency也没有工作,我仍然收到同样的错误。
最佳答案
我像这样使用 javafx-maven-plugin 和 maven-shade-plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.3</version>
<configuration>
<mainClass>Your_main_class</mainClass>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>Your_main_class_starter</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Your_main_class 是这样的:
public class App extends Application {
private static Scene scene;
@Override
public void start(Stage stage) throws IOException {
Parent mainForm = FXMLLoader.load(getClass().getResource("mainForm.fxml"));
scene = new Scene(mainForm , 425, 275);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
而 Your_main_class_starter 看起来像这样:
public class LaunchApp {
public static void main(String[] args) {
App.main(args);
}
所以 Your_main_class_starter 除了调用你的主类之外什么都不做。
关于java - 在可执行 JAR 中将 JavaFX 库与 Maven 捆绑在一起(适用于 Java 11+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58974100/