如何使用Maven构建含所有依赖的JavaFX可执行jar包并解决相关报错
问题解决路径
报错根因说明
no main manifest attribute, in csci6461-1.0-SNAPSHOT.jar:你当前运行的是Maven默认生成的未绑定主类、未携带依赖的普通项目jar包,不是maven-assembly-plugin生成的带依赖的目标jar。Error: JavaFX runtime components are missing:OpenJFX 11+未内置在标准JDK中,直接打包继承Application的JavaFX主类作为入口时,会触发JavaFX模块检查机制,无法从fat jar中正常加载运行时组件。你pom中引入的org.codeartisans.javafx相关依赖是早已停止维护的过时组件,没有实际作用。
最优解决步骤
步骤1:清理无效依赖
删除pom.xmldependencies节点下的两行无效依赖:
<dependency> <groupId>org.codeartisans.javafx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>1.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.codeartisans.javafx</groupId> <artifactId>javafx-deployer-maven-plugin</artifactId> <version>1.2</version> <scope>compile</scope> </dependency>
步骤2:新增JavaFX启动入口类
避免直接用继承Application的类作为主类,新建启动类com.csci6461.Launcher,代码如下:
package com.csci6461; public class Launcher { public static void main(String[] args) { // 调用你原有JavaFX主类的main方法 ComputerSimulation.main(args); } }
步骤3:修正assembly插件主类配置
修改pom.xml中maven-assembly-plugin的mainClass为新建的启动类:
<archive> <manifest> <mainClass>com.csci6461.Launcher</mainClass> </manifest> </archive>
步骤4:打包运行
执行mvn clean package命令完成打包,进入target目录,运行后缀为-jar-with-dependencies.jar的文件即可:
java -jar csci6461-1.0-SNAPSHOT-jar-with-dependencies.jar
更友好的分发方案(无需用户预装JDK)
如果需要给未安装Java环境的普通用户使用,可通过javafx-maven-plugin的jlink能力生成独立运行包:
- 在
build/plugins节点下新增插件配置:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>com.csci6461.Launcher</mainClass> <launcher>CSCI6461模拟器</launcher> </configuration> </plugin>
- 执行
mvn clean javafx:jlink命令,生成的独立运行包在target/image目录下,windows系统双击bin/CSCI6461模拟器.bat、mac/Linux系统运行bin/CSCI6461模拟器即可直接启动,无需预装任何Java环境。
内容的提问来源于stack exchange,提问作者Ellis Thompson
相关产品推荐
相关产品推荐

