You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:57:04