无法执行JAR文件:找不到或无法加载主类问题求助
解决可执行JAR主类找不到的问题
优先用Gradle配置搞定(比手动打包靠谱得多)
别折腾手动写Manifest了,Gradle的官方插件能帮你自动处理:
- 如果你用Groovy版的
build.gradle,添加以下配置:
plugins { id 'java' id 'application' } application { mainClass = 'com.ikea.us.test.MyClass' // 填完整类名,不带.class后缀 }
要是用Kotlin DSL的build.gradle.kts,就这么写:
plugins { java application } application { mainClass.set("com.ikea.us.test.MyClass") }
执行./gradlew assemble,生成的可执行JAR在build/libs/目录下,直接运行这个JAR就行。
如果需要打包含所有依赖的胖包(方便部署到Docker),加个shadow插件:
Groovy版build.gradle补充:
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' } shadowJar { mainClassName = 'com.ikea.us.test.MyClass' }
执行./gradlew shadowJar,build/libs/下的胖包直接就能运行。
手动打包的必踩坑(非要自己弄的话)
- Manifest格式不能错:
- 最后一行必须是空行(换行),否则JAR工具会忽略最后一行配置
Main-Class的写法严格遵循:Main-Class: com.ikea.us.test.MyClass,冒号后面必须有一个空格,类名不能带.class
- 打包命令要精准:
别用jar cfm app.jar Manifest.txt *,*会把根目录所有文件都打包,包括Manifest.txt本身。正确做法是先进入编译后的class文件目录(比如build/classes/java/main),再执行:jar cfm app.jar /path/to/your/Manifest.txt com/ikea/us/test/*.class - 检查JAR内容:
解压JAR,确认存在com/ikea/us/test/MyClass.class文件,路径必须和包名完全对应;同时打开META-INF/MANIFEST.MF,核对Main-Class配置有没有拼写错误或多余空格。
最后排查关键点
- 确认主类
com.ikea.us.test.MyClass里有public static void main(String[] args)方法,签名必须完全一致 - 试试直接运行:
java -cp app.jar com.ikea.us.test.MyClass,如果能跑通,说明JAR里有类但Manifest配置错了;如果还是报错,说明JAR里根本没包含这个类,或者编译后的类路径不对
内容的提问来源于stack exchange,提问作者Darth_Zitro
相关产品推荐
相关产品推荐

