使用Maven打包JavaFX为可执行fat JAR时类路径无效问题问询
解决方案
1. 新增独立启动类
不要直接用继承Application的com.sjsm.App作为主类,新增一个无继承的启动类com.sjsm.Launcher,代码如下:
package com.sjsm; public class Launcher { public static void main(String[] args) { App.main(args); } }
2. 调整maven-shade-plugin配置
修改pom.xml中插件配置,更换主类为新增的Launcher,补充服务资源转换器合并JavaFX相关服务配置,修改后的配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <goals> <goal>shade</goal> </goals> <configuration> <shadedArtifactAttached>true</shadedArtifactAttached> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 更换为新增的启动类 --> <mainClass>com.sjsm.Launcher</mainClass> </transformer> <!-- 新增服务资源转换器,合并各依赖中的服务配置文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin>
3. 确认JavaFX依赖配置
检查pom中JavaFX相关依赖是否包含对应操作系统的分类器,如需制作跨平台可运行JAR,可同时引入Windows、MacOS、Linux三类平台的依赖,示例如下:
<dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>17.0.8</version> <classifier>win</classifier> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>17.0.8</version> <classifier>mac</classifier> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>17.0.8</version> <classifier>linux</classifier> </dependency> <!-- 其余JavaFX组件如fxml、graphics等按相同规则配置 --> </dependencies>
4. 打包运行
执行mvn clean package命令完成打包,在target目录下找到后缀为-shaded.jar的文件,执行java -jar xxx-shaded.jar即可正常运行。
问题原因说明
JavaFX 11及以上版本采用模块化设计,直接将继承Application的类作为JAR主类运行时,JVM会强制要求JavaFX组件以模块形式加载,普通fat JAR默认没有对应模块配置,就会抛出运行时组件缺失错误。新增独立启动类的方式绕开了模块检查逻辑,从普通类入口加载JavaFX组件即可正常运行。
内容的提问来源于stack exchange,提问作者TurgonTheKingOfGondolin
相关产品推荐
相关产品推荐

