JavaFX项目构建jar运行提示找不到主类 手动编译缺依赖包报错
问题原因分析
- 可执行jar运行找不到主类的原因
- IDEA构建artifact时未正确配置主类路径,或打包时未将
myProgram.Main对应的编译后class文件放入jar包正确的目录结构中。 - MANIFEST.MF文件的
Main-Class属性配置错误,比如写错包名、多写了.class后缀、行尾存在多余空格。 - 构建artifact时未将JavaFX及其他第三方依赖正确打入jar包,类路径配置冲突导致主类加载失败。
- 直接用javac编译报错的原因
手动执行javac -classpath . myProgram/Main.java时,未将JavaFX的SDK库路径加入编译类路径,也未配置对应的模块参数,javac无法找到JavaFX相关依赖包就会抛出包不存在的错误。IDEA中能正常运行是因为IDE已经自动配置好了依赖路径和VM参数,手动操作时未传递对应参数就会报错。
解决方案
修复jar包找不到主类的问题
- 打开IDEA项目结构设置(快捷键
Ctrl+Alt+Shift+S),依次点击【Artifacts】,找到当前项目的jar构建配置。 - 检查【Main Class】选项,不要手动输入,直接从下拉框选择
myProgram.Main,避免拼写错误。 - 切换到【Output Layout】标签,确认编译后的
myProgram/Main.class文件存在,且所有第三方依赖(包括JavaFX、font-awesome、jfoenix、html-unit、jasper-reports等)都被包含在输出结构中,推荐选择【extract to the target JAR】将所有依赖打入同一个jar包,避免外部依赖路径问题。 - 检查MANIFEST.MF文件,确保文件存放在
src/META-INF目录下,文件内Main-Class属性值为myProgram.Main,不要加.class后缀,行尾不要有多余空格。 - 配置完成后删除旧的构建产物,重新构建artifact即可。
修复jar包运行时的JavaFX依赖问题
JavaFX从JDK11版本开始已从官方JDK中剥离,就算把依赖打入jar包,运行时也需要传递对应的模块参数,不能直接使用java -jar myProgram.jar运行,完整运行命令如下:
java --module-path "C:\Program Files\Java\javafx-sdk-14.0.2\lib" --add-modules javafx.fxml,javafx.controls,javafx.base,javafx.web,javafx.media,javafx.graphics --add-opens javafx.base/com.sun.javafx.runtime=ALL-UNNAMED --add-opens javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED --add-opens javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED --add-opens javafx.base/com.sun.javafx.binding=ALL-UNNAMED --add-opens javafx.base/com.sun.javafx.event=ALL-UNNAMED --add-opens javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED -jar myProgram.jar
如果觉得每次运行输入参数繁琐,可以将以上命令写入bat脚本,双击脚本即可直接运行。
可选:手动javac编译的正确命令
如果需要手动通过命令行编译代码,需要将JavaFX库加入编译路径,命令如下:
javac --module-path "C:\Program Files\Java\javafx-sdk-14.0.2\lib" --add-modules javafx.fxml,javafx.controls,javafx.base,javafx.web,javafx.media,javafx.graphics -classpath . myProgram/Main.java
编译完成后运行代码的命令和上面jar运行的命令一致即可。
内容的提问来源于stack exchange,提问作者EFHMedia
相关产品推荐
相关产品推荐

