将 JavaFX 库与 Maven 捆绑在可执行 JAR(适用于 Java 11+)中



我正在使用Java 8JavaFX.当我将可执行JARmaven打包时,可执行文件JAR使用Java 8正常工作。但是,如果我运行JAR例如Java 13,我收到以下错误:

Error: Could not find or load main class ApplicationLauncherClient
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

这可能是由于自Java 11以来JavaFX不再与JRE/JDK捆绑在一起造成的。

我的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中包含JavaFX来构建一个可以在大于或等于 8 的任何Java版本上运行的JAR

我没有成功遵循此答案中的说明(例如,将JavaFX插件添加到我的pom.xml中)。将OpenJFX作为依赖项也不起作用,我仍然收到相同的错误。

我使用 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除了调用您的主类之外什么都不做。

最新更新