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

IntelliJ打包含JavaFX、JFreeChart的Jar包报错求助

JavaFX项目打包Jar运行报错的解决方法

我需要把项目打包成.jar文件,脱离IDE或Shell在不同设备和操作系统上运行。用IntelliJ开发,生成的.jar运行时出现如下错误:

Sep 07, 2023 6:03:47 PM com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @228575c0'
Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283)
at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:253)
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:263)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:290)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:162)
at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:651)
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:671)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
... 1 more
Exception in thread "main" java.lang.RuntimeException: No toolkit found
at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:275)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:290)
at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:162)
at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:651)
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:671)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:1589)

项目用到JavaFX和JFreeChart,之前的配置是:

  • 通过本地路径在IntelliJ的File>Project Structure>Libraries中引入JavaFX
  • 通过Maven引入JFreeChart

问题根源

错误是因为JavaFX的图形渲染管道依赖本地平台库,本地引入的方式无法将这些依赖打包到Jar中,且JavaFX从JDK11开始为模块化框架,直接本地导入Jar无法处理跨平台依赖逻辑。

解决步骤

1. 改用Maven统一管理所有依赖

删除IntelliJ中本地引入的JavaFX库,在pom.xml中添加JavaFX和JFreeChart的依赖及打包插件:

依赖配置(根据你的JavaFX版本调整,示例为20)

<dependencies>
    <!-- JFreeChart依赖 -->
    <dependency>
        <groupId>org.jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.5.3</version>
    </dependency>
    <!-- JavaFX核心模块,按需添加其他模块(如javafx-graphics、javafx-media等) -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>20</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>20</version>
    </dependency>
</dependencies>

打包插件配置

<build>
    <plugins>
        <!-- JavaFX专用打包插件,生成跨平台独立运行包 -->
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.8</version>
            <configuration>
                <!-- 替换为你的主类全限定名,例如com.example.MyApplication -->
                <mainClass>你的主类完整路径</mainClass>
            </configuration>
        </plugin>
        <!-- 可选:生成包含所有依赖的可执行Jar -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.4.2</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>你的主类完整路径</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2. 执行打包操作

  • 打开IntelliJ的Maven窗口,依次运行Lifecycle下的clean和package命令。
  • 若使用javafx-maven-plugin,运行javafx:jlink可生成包含JRE和JavaFX本地依赖的跨平台运行镜像(推荐,无需用户安装Java环境)。
  • 若使用maven-assembly-plugin,会在target目录下生成带-jar-with-dependencies后缀的可执行Jar。

3. 运行打包产物

  • 独立运行镜像:直接执行对应平台的启动脚本(Windows为.bat,Linux/macOS为.sh)。
  • 可执行Jar:运行时需确保Java环境包含JavaFX模块,或指定模块路径(适合测试,跨平台需手动适配):
java --module-path "javafx库路径" --add-modules javafx.controls,javafx.fxml -jar 你的项目Jar包名.jar

注意事项

  • 主类若不是Application子类,需在main方法中手动调用Platform.startup()初始化JavaFX环境。
  • JavaFX版本需与JDK版本兼容(如JDK17对应JavaFX17-20)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:23:09