使用Eclipse导出含MANIFEST.MF的JAR文件后提示“No main manifest attribute in jar”的问题及MANIFEST.MF末尾空行含义咨询
问题解答:JAR运行提示“No main manifest attribute”的原因及清单文件空行的作用
一、你遗漏的关键步骤及问题根源
出现“No main manifest attribute in jar”错误,大概率是以下几个环节出了问题,我给你逐一拆解:
目录名称拼写错误:你提到在src下创建了
META-MF文件夹,但Java规范要求清单文件必须放在META-INF(注意是INF不是MF)目录下。Eclipse和JVM只会识别这个标准目录,所以目录名写错的话,你的自定义清单根本不会被打包进JAR里,自然找不到Main-Class属性。导出JAR时未指定自定义清单:Eclipse导出JAR的默认流程会自动生成一个新的MANIFEST.MF,如果你没有手动指定使用自己创建的那个,Eclipse就会用它生成的默认清单(里面没有Main-Class配置)覆盖你的文件。正确的导出步骤应该是:
- 右键项目 → 导出 → JAR文件
- 选择要打包的文件后,进入“Jar Manifest Specification”界面
- 勾选“Use existing manifest from workspace”,然后通过浏览选择你src下
META-INF/MANIFEST.MF文件 - 完成后续导出步骤
清单文件格式不符合规范:即使目录和导出步骤都对,如果你的MANIFEST.MF格式有问题,JVM也无法识别Main-Class。比如:
Main-Class: FrameLogin这一行,冒号后面必须有一个空格- 每个属性行(包括Manifest-Version和Main-Class)都要以换行结尾,且文件末尾必须保留空行(这个刚好对应你的额外问题)
二、为什么清单文件末尾需要保留空行?
Java的清单文件解析器是按行读取并解析属性的,它会把每一个以换行结束的行视为一个完整的属性条目。如果你的清单文件最后一行(比如Main-Class: FrameLogin)后面没有空行,解析器会认为这个属性没有完全结束,从而忽略它。简单来说,空行是在告诉解析器:“这个属性已经结束了,没有后续内容了”,确保所有配置的属性都能被正确识别加载。
举个例子,正确的MANIFEST.MF格式应该是这样的:
Manifest-Version: 1.0 Main-Class: FrameLogin
(注意最后一行是空的)
内容的提问来源于stack exchange,提问作者xxx
相关产品推荐
相关产品推荐

