使用Terminal创建可执行JAR后运行报错:无主清单属性
问题诊断与解决方案
这个问题我之前也碰到过!核心原因是你的MANIFEST.MF里的Main-Class属性被错误设置成了Test.class,而不是你原本指定的Test,导致Java找不到正确的主类入口。
为什么会出现这个问题?
最常见的诱因是manifest.mf文件的格式不符合Java的严格要求:
- Java要求manifest文件的每一行(包括最后一行)必须以换行符结尾,如果你的文件最后一行没有换行,jar工具在打包时可能会读取不完整,甚至错误地附加内容到属性值里。
- 另外,Main-Class属性的格式必须严格是
Main-Class: 主类名(冒号后面必须有一个空格,不能省略),格式错误也可能导致打包时属性值异常。
修复步骤
1. 重新创建符合规范的manifest.mf文件
用文本编辑器(推荐Notepad++、vim这类工具,避免系统记事本的编码问题)创建文件,内容严格为:
Main-Class: Test
⚠️ 重要:写完Test后一定要按回车,确保最后一行有换行符,并且保存为UTF-8无BOM格式。
2. 重新执行打包命令
先删除之前生成的Test.jar,然后执行正确的打包命令:
jar -cvfm Test.jar manifest.mf Test.class
(参数顺序要注意:c=创建jar,v=显示打包详情,f=指定jar文件名,m=指定manifest文件,顺序是cvfm,后续依次是jar文件名、manifest文件、要打包的类文件)
3. 验证并测试
- 解压
Test.jar查看META-INF/MANIFEST.MF,确认里面的Main-Class值是Test而不是Test.class。 - 执行
java -jar Test.jar,应该就能正常输出Hello World了!
更简便的替代方法
其实你可以不用手动创建manifest文件,直接用jar命令的-e参数指定主类,jar工具会自动生成符合规范的MANIFEST.MF:
jar -cvfe Test.jar Test Test.class
这个方法更不容易出错,适合快速打包简单的可执行jar。
内容的提问来源于stack exchange,提问作者infinitezero




