使用Maven导出JavaFX项目Jar包时遇运行异常问题
问题:JavaFX Maven打包后无参数运行报错
我用Maven导出JavaFX项目的Jar包,pom.xml中已配置所有JavaFX依赖,生成Jar包时Maven无警告,但运行时提示:
Error: Could not find or load main class packagename.MAIN
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
添加VM参数后可正常运行,但我希望无需参数也能运行,恳请帮忙解答。
原pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>prova</groupId> <artifactId>name</artifactId> <version>1.0</version> <name>ClientS</name> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <javafx.maven.plugin.vertion>0.0.8</javafx.maven.plugin.vertion> </properties> <dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>21-ea+24</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>21-ea+24</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-base</artifactId> <version>21-ea+24</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>21-ea+24</version> </dependency> </dependencies> <build> <plugins> <!-- Configure maven-jar-plugin to include the manifest file --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <!-- Adjust the version if needed --> <configuration> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin> <!-- Configure javafx-maven-plugin for JavaFX --> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>packagename.MAIN</mainClass> </configuration> </plugin> </plugins> </build> </project>
问题原因
- JavaFX从JDK 11开始作为独立模块存在,默认不在JDK的类路径中,普通Maven打包生成的Jar只包含自身代码,不会自动将JavaFX依赖打包进去。
- 当前配置的
maven-jar-plugin仅打包项目代码,javafx-maven-plugin仅指定了主类,未执行生成可执行Jar的逻辑,导致运行时找不到JavaFX核心类。
解决方法
修改pom.xml,让javafx-maven-plugin负责生成包含JavaFX依赖的可执行Jar,同时移除手动指定的MANIFEST文件引用:
修改后的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>prova</groupId> <artifactId>name</artifactId> <version>1.0</version> <name>ClientS</name> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <javafx.maven.plugin.version>0.0.8</javafx.maven.plugin.version> <!-- 修正拼写错误 --> </properties> <dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>21-ea+24</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>21-ea+24</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-base</artifactId> <version>21-ea+24</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>21-ea+24</version> </dependency> </dependencies> <build> <plugins> <!-- 移除自定义MANIFEST配置,由javafx-maven-plugin自动生成 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> </plugin> <!-- 配置javafx-maven-plugin生成可执行Jar --> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>${javafx.maven.plugin.version}</version> <configuration> <mainClass>packagename.MAIN</mainClass> </configuration> <executions> <execution> <id>default-cli</id> <goals> <goal>jar</goal> <!-- 生成包含JavaFX依赖的可执行Jar --> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
打包与运行
- 执行打包命令:
mvn clean javafx:jar - 打包完成后,在
target目录下会生成类似name-1.0-jfx.jar的可执行Jar - 直接运行:
java -jar target/name-1.0-jfx.jar,无需额外VM参数即可启动程序
内容的提问来源于stack exchange,提问作者ibr
相关产品推荐
相关产品推荐

