IntelliJ中Maven JavaFX项目可执行Jar启动失败求助
JavaFX Maven项目打包可执行Jar启动失败问题解决
问题1:执行java -jar时找不到JavaFX类
运行命令java -jar myproject-1.0-SNAPSHOT.jar出现错误:
Error: Could not find or load main class mypackage.myproject.Main Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
原因
JavaFX自JDK 11起不再捆绑在JDK中,默认的maven-jar-plugin打包的Jar仅包含项目自身代码,不会引入依赖的JavaFX类,导致运行时找不到相关类。
解决办法
方案1:使用jlink创建自包含运行镜像(官方推荐)
你的pom中已配置javafx-maven-plugin,直接执行以下命令生成包含JRE和所有依赖的自包含镜像:
mvn clean javafx:jlink
生成的镜像位于target/app目录,可通过目录内的启动脚本(Windows为app.exe,Linux/macOS为app)直接启动应用,无需额外安装JDK/JavaFX。
方案2:打包包含所有依赖的胖Jar
添加maven-shade-plugin到pom的build/plugins中,打包时合并所有依赖并排除冲突的签名文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>mypackage.myproject.Main</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
执行mvn clean package后,target目录下的PearCar-1.0-SNAPSHOT.jar即为可直接运行的胖Jar,通过java -jar命令启动即可。
问题2:IntelliJ Artifact生成Jar出现签名校验错误
生成的Jar启动时出现:
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
原因
项目依赖的部分Jar(如Aspose PDF、iText)带有数字签名,打包时将签名文件(.SF/.DSA/.RSA)一并包含,导致JVM校验签名时失败。
解决办法
方法1:使用maven-shade-plugin打包(同问题1的方案2)
插件配置中的filters已自动排除所有签名文件,避免校验错误。
方法2:修改IntelliJ Artifact配置
- 打开
File > Project Structure > Artifacts - 选中你的Jar artifact,展开右侧的
Available Elements - 逐个展开依赖Jar,右键点击
META-INF下的.SF/.DSA/.RSA文件,选择Exclude - 重新构建Artifact即可
额外优化建议
- 更新JavaFX版本:将pom中JavaFX依赖的版本从
19-ea+7替换为正式版19,避免预览版潜在问题。 - 补充缺失依赖:你的
module-info.java中声明了requires commons.lang3;,但pom中未添加该依赖,需补充:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
- 检查module路径配置:
javafx-maven-plugin中的mainClass格式应为模块名/主类全路径,你的配置mypackage.myproject/mypackage.myproject.Main是正确的,无需修改。
内容的提问来源于stack exchange,提问作者java-user2000
相关产品推荐
相关产品推荐

