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
相关产品推荐
相关产品推荐

