运行IDEA打包的JavaFX JAR文件出现配置不支持与资源找不到错误
问题复现
运行报错日志
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @121464c3' Exception in Application start method Exception in thread "main" java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:831) Caused by: javafx.fxml.LoadException: file:/C:/Users/user/Desktop/MP3Player.jar!/resources/FXML/homePage.fxml:15 at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2707) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2685) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3323) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3280) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3249) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3222) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3199) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3192) at main.Main.start(Main.java:18) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:474) at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:447) at java.base/java.security.AccessController.doPrivileged(AccessController.java:391) at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:446) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... 1 more Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found at javafx.scene.image.Image.validateUrl(Image.java:1125) at javafx.scene.image.Image.<init>(Image.java:618) at main.HomePageController.<init>(HomePageController.java:56) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128) at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:350) at java.base/java.lang.Class.newInstance(Class.java:642) at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:938) at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:982) at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:229) at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:754) at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2808) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2634) ... 17 more Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found at javafx.scene.image.Image.validateUrl(Image.java:1117) ... 32 more
核心错误栈
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found at javafx.scene.image.Image.validateUrl(Image.java:1125) at javafx.scene.image.Image.<init>(Image.java:618) at main.HomePageController.<init>(HomePageController.java:56)
环境与操作说明
- 开发环境:Intellij IDEA 2021.2 社区版、JDK 16.0.2、JavaFX SDK 16
- JAR构建流程:
- 路径:文件 -> 项目结构 -> 工件 -> + -> JAR -> 从带有依赖的模块创建,指定主类为
main.Launcher - META-INF/MANIFEST.MF存放目录:
C:\Users\user\IdeaProjects\MP3Player\src - 生成JAR后手动添加
C:\Program Files\Java\javafx-sdk-16\bin目录下所有.dll文件
- 路径:文件 -> 项目结构 -> 工件 -> + -> JAR -> 从带有依赖的模块创建,指定主类为
相关配置
MANIFEST.MF内容
Manifest-Version: 1.0 Main-Class: main.Launcher
项目结构
MP3Player ├──.idea ├──out ├──src(标记为源根目录) │ ├──main │ │ ├──HomePageController.java │ │ ├──Launcher.java │ │ ├──Main.java │ │ │ ├──recources │ ├──FXML │ ├──images │ ├──media │ ├──app.css │ ├──nightApp.css │ ├──sidebar.css │ ├──target ├──.gitignore ├──MP3Player.iml ├──pom.xml ├──README.md
IDEA运行VM参数
--module-path "C:\Program Files\Java\javafx-sdk-16\lib" --add-modules=javafx.controls,javafx.fxml --add-modules=javafx.controls,javafx.media
pom.xml主类配置
<mainClass>main.Launcher</mainClass>
问题原因与解决方案
- 资源文件夹命名错误
你的资源文件夹拼写为recources,正确拼写应为resources,如果代码里读取资源时用的是正确拼写的路径,打包后自然找不到对应文件。 - 资源读取方式错误
IDEA运行时读取的是本地文件系统的资源路径,打包成JAR后资源存放在JAR包内部,不能直接用相对路径、File类读取,必须通过类加载器获取内部资源,修改HomePageController.java第56行的Image初始化代码即可:
// 错误写法,打包后失效 Image image = new Image("images/xxx.png"); // 正确写法,从类路径读取JAR内部资源 Image image = new Image(getClass().getResourceAsStream("/images/xxx.png"));
- 运行JAR时缺少JavaFX参数
你直接用java -jar MP3Player.jar运行,没有指定JavaFX的模块参数,就算资源问题修复也会启动失败,正确运行命令为:
java --module-path "C:\Program Files\Java\javafx-sdk-16\lib" --add-modules javafx.controls,javafx.fxml,javafx.media -jar MP3Player.jar
如果需要做无需用户安装JavaFX的可执行程序,建议用jlink/jpackage打包成带运行时的镜像。
4. 打包方式不规范
IDEA自带的工件打包容易漏资源、依赖,你是Maven项目,建议用maven-shade-plugin或者maven-assembly-plugin打带依赖的JAR,同时在pom.xml中添加资源拷贝规则,确保资源文件被打包到类路径下:
<build> <resources> <resource> <directory>src/resources</directory> <includes> <include>**/*.*</include> </includes> </resource> </resources> </build>
内容的提问来源于stack exchange,提问作者Daniyar Amirov
相关产品推荐
相关产品推荐

