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

使用Maven Shade打包JavaFX项目为Fat Jar遇运行异常求助

JavaFX项目Maven Shade打包问题解决方案

现象原因

  • JRE无法启动Jar:Java 11及以后版本中,JavaFX不再是JDK/JRE的内置组件。纯净版JRE不包含JavaFX运行时类库,启动时找不到javafx.application.Application等核心类,因此抛出异常;而你的JDK可能捆绑了JavaFX或本地环境配置了依赖路径,所以能正常运行。
  • Unsupported JavaFX configuration警告:Maven Shade插件只是简单合并所有依赖类到一个Jar,未遵循JavaFX的模块化规范。JavaFX本身是命名模块(javafx.*),但打包后所有类被放入未命名模块,不符合JavaFX运行要求,触发警告。

解决办法

方案1:调整Maven Shade配置(适配JRE+消除警告)

修改pom.xml中的Shade插件配置,添加模块属性并指定正确主类:

<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>
                    <!-- 指定非Application的Main类作为入口 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.yourpackage.Main</mainClass>
                    </transformer>
                    <!-- 合并服务配置,适配JavaFX模块系统 -->
                    <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>

确保Main类代码正确:

public class Main {
    public static void main(String[] args) {
        javafx.application.Application.launch(App.class, args);
    }
}

打包后,Jar会包含所有JavaFX依赖,纯净JRE也能运行(注意:部分老旧JRE可能不兼容,建议使用对应版本的JRE)。

方案2:使用官方推荐的JavaFX打包工具(更稳定)

Shade并非JavaFX官方推荐的打包方式,更推荐以下两种工具:

  • jlink生成自定义JRE镜像:
    在pom.xml添加javafx-maven-plugin配置:

    <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.8</version>
        <configuration>
            <mainClass>com.yourpackage.App</mainClass> <!-- 直接用继承Application的类 -->
            <launcher>distcalc</launcher> <!-- 启动脚本名称 -->
            <jlinkImageName>distcalc-app</jlinkImageName> <!-- 生成的镜像目录 -->
        </configuration>
    </plugin>
    

    执行命令:mvn javafx:jlink,生成的镜像目录自带JRE和启动脚本,用户无需额外安装Java环境。

  • jpackage生成原生安装包:
    先执行mvn package生成Jar,再用jpackage命令(JDK 16+支持)生成exe/dmg/deb等安装包:

    jpackage --name distcalc --input target --main-jar distcalc-1.0.jar --main-class com.yourpackage.Main --type exe
    

    生成的安装包可直接分发,用户安装后点击即可运行,无需关心Java环境。

额外注意事项

确保pom.xml中JavaFX依赖指定了对应操作系统的分类器:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>21.0.1</version>
        <classifier>win</classifier> <!-- 替换为mac/linux适配你的开发环境 -->
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>21.0.1</version>
        <classifier>win</classifier>
    </dependency>
</dependencies>

内容的提问来源于stack exchange,提问作者Miles Leech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:45:06