我正在使用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
这可能是由于自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除了调用您的主类之外什么都不做。