java - JavaFX 11 jar 不可执行 java.lang.NoClassDefFoundError: javafx/application/Application
问题描述
几年来,我一直在 JDK 8 上使用 JavaFX。现在我想尝试将我们的 JDK 升级到 OpenJDK 11 和 OpenJFX 11。
在 Apache NetBeans 12.2 上,我尝试了 Maven 示例,它在 NetBeans 上运行良好(右键单击-> 运行)。
但我不能从 jar 文件运行它,甚至不能从 shell 使用 java -jar testJavaFX.jar
我总是得到
Error: Could not find or load main class
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
我尝试在 RUN config vmOptions 中添加
--module-path %PATH_TO_FX%
--add-modules javafx.controls,primary.fxml
(也尝试了 javafx.fxml 和绝对路径而不是 %PATH_TO_FX%)
当我这样做时,我什至无法在 NetBeans 上运行它
我收到错误
java.lang.module.FindException: Module javafx.controls not found
Command execution failed.
或者
cd C:\Users\TCN\Documents\NetBeansProjects\testJavaFX;
"JAVA_HOME=C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.11.9-hotspot" cmd /c "\"
C:\\Program Files\\NetBeans-12.2\\netbeans\\java\\maven\\bin\\mvn.cmd\"
-Dexec.args=\"--module-path \\\"C:\\Program Files\\Java\\javafx-sdk-11.0.2\\lib\\\"
--add-modules javafx.controls,javafx.fxml -classpath %classpathtestJavaFX.java
-classpath %classpath testJavaFX.java
-classpath %classpath javafx.controls ,primary.fxml
-classpath %classpath javafx.controls ,javafx.fxml
-classpath %classpath javafx.controls
-classpath %classpath javafx.controls testJavaFX.java
-classpath %classpath com.tradeconnex.testjavafx.App\"
-Dexec.executable=\"C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.11.9-hotspot\\bin\\java.exe\"
-Dmaven.ext.class.path=\"C:\\Program Files\\NetBeans-12.2\\netbeans\\java\\maven-nblib\\netbeans-eventspy.jar\"
-Dfile.encoding=UTF-8
-Prelease-profile process-classes org.codehaus.mojo:exec-maven-plugin:3.0.0:exec"
The syntax of the command is incorrect.
我在 Mac 和 Windows 机器上都试过这个,结果是一样的。
我猜程序找不到 javafx。
我已将 PATH_TO_FX 设置为 C:\Program Files\Java\javafx-sdk-11.0.2\lib (尝试使用和不使用引号 "" 的 lib 和 bin 并尝试将它们放在 Path 变量中)
我的 JDK 是 jdk-11.0.11.9-hotspot
安装 JDK11 后,我的旧 jdk8 javafx 项目现在也无法运行。
我尝试将所有 javafx jar 从 maven 添加到我的 POM,我再次只能从 NetBeans 运行它。
同样,来自 JDK 8 和 JDK11 的应用程序都在 NetBeans 中运行良好,但都不能从 jar 或 shell 运行。来自 jdk8 的旧 JavaFX jar 曾经是可执行的,现在不是。
请问有人有解决办法吗?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>testJavaFX</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>testJavaFX</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<javafx.version>11</javafx.version>
<mainClass>com.company.testjavafx.App</mainClass>
</properties>
<dependencies>
<!-- <dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>13.0.2</version>
<type>pom</type>
</dependency>-->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>11.0.2</version>
</dependency>
</dependencies>
<build>
<finalName>testJavaFX</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<excludeScope>system</excludeScope>
<excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.company.testjavafx.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.4</version>
<configuration>
<mainClass>com.company.testjavafx.App</mainClass>
</configuration>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
</execution>
<execution>
<!-- Configuration for manual attach debugging -->
<!-- Usage: mvn clean javafx:run@debug -->
<id>debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:8000</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE debugging -->
<id>ide-debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
</options>
</configuration>
</execution>
<execution>
<!-- Configuration for automatic IDE profiling -->
<id>ide-profile</id>
<configuration>
<options>
<option>${profiler.jvmargs.arg1}</option>
<option>${profiler.jvmargs.arg2}</option>
<option>${profiler.jvmargs.arg3}</option>
<option>${profiler.jvmargs.arg4}</option>
<option>${profiler.jvmargs.arg5}</option>
</options>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
解决方案
您可以做的是将所有 javafx 模块加载为 maven 依赖项,并使用扩展您的 Main 类并执行 main 函数的 Launcher 类。我已经为此写了一篇完整的媒体文章。一探究竟。
还。您还没有提到您的应用程序是模块化的还是非模块化的。即使您的应用程序是模块化的,这种方法也有效,但您必须在模块信息文件中进行必要的更改。
推荐阅读
- python - 无法使用 python sounddevice 在左右扬声器上播放
- javascript - Bootstrap v4.1 中的动画不起作用
- python - 复制脚本将非 ASCII 字符添加到新文件的末尾
- database - 为冰球联盟数据库设计 ER 图
- python - 在快速计算机上缓慢迭代
- python - Sympy:解决 Hessian 矩阵中的条目以获得更好的可读性?
- python - Swagger - 如果 JSON 数组从 0 开始,它不会将其视为对象
- javascript - JavaScript 中的对象引用比较
- firebase - 为什么不建议为所有设备启用离线支持?
- android - build.gradle api 项目(路径:':libName')与 api 项目(':libName')(路径:关键字)之间的区别