该错误是jvm执行java -jar时因jar包中meta-inf/manifest.mf缺失或格式错误的main-class属性所致,与jdk厂商无关;需确保清单文件严格符合规范:首行为manifest-version: 1.0,次行main-class: com.example.app(冒号后仅一个空格、无bom、末行为空行),且maven等构建工具配置正确。

java -jar 报 “no main manifest attribute” 是什么问题
这不是 OpenJDK 特有的问题,而是任何 JDK(包括 OpenJDK)在执行 java -jar 时的通用校验逻辑:JVM 会严格检查 JAR 包内 META-INF/MANIFEST.MF 文件是否包含 Main-Class 属性。如果缺失或格式错误,就直接报错,不给 fallback。它和你装的是 Oracle JDK 还是 OpenJDK 无关,只和这个 MANIFEST.MF 有没有写对有关。
用 jar 命令手动打包时怎么加 Main-Class
如果你没用 Maven/Gradle,而是直接用 jar 命令打包,必须显式指定清单文件:
-
jar cfm myapp.jar MANIFEST.MF *.class—— 注意参数顺序:c创建、f指定输出文件、m指定清单文件 -
MANIFEST.MF文件内容必须严格满足格式:首行是Manifest-Version: 1.0,Main-Class:行末不能有多余空格,冒号后必须跟一个**且仅一个**空格,再写全限定类名,例如:Main-Class: com.example.App - 最后一行必须是空行,否则部分 JVM(尤其是较新版本的 OpenJDK)会忽略整个
Main-Class字段 - 验证方式:
unzip -p myapp.jar META-INF/MANIFEST.MF,确认输出里有且只有你写的那行Main-Class
Maven 打包却没生成 Main-Class 的常见坑
即使写了 maven-jar-plugin,也常因配置位置或插件冲突失效:
- 确保插件放在
<build><plugins></plugins></build>下,而不是<pluginmanagement></pluginmanagement>里(后者只是声明,不生效) - Spring Boot 项目必须用
spring-boot-maven-plugin,禁用maven-jar-plugin;否则mvn package生成的是普通 JAR,不是 fat jar,Main-Class会被设成org.springframework.boot.loader.JarLauncher,但前提是插件必须启用 - 检查是否误配了
<skip>true</skip>—— 某些模板里默认设为 true,导致插件被跳过 - 运行
mvn clean package后,用jar -tf target/*.jar | grep MANIFEST确认META-INF/MANIFEST.MF存在,再用unzip -p target/*.jar META-INF/MANIFEST.MF查看内容
OpenJDK 17+ 对 MANIFEST.MF 格式更敏感
较新版本 OpenJDK(如 17、21)对换行、空格、编码更严格,容易踩隐形坑:
- MANIFEST.MF 必须是 UTF-8 编码,且**不能带 BOM**;用 VS Code 或 Notepad++ 保存时选 “UTF-8 无 BOM”
- 每行最大长度 72 字符,超长行会被自动折行(用空格续行),但
Main-Class不该被折,所以类名别太长 - 字段名大小写敏感:
Main-Class不能写成main-class或MAIN-CLASS - 如果你用 IDE 导出 Runnable JAR,注意 Eclipse/IntelliJ 默认生成的 MANIFEST.MF 可能含多余空行或注释,建议导出后手动检查
最易被忽略的一点:很多开发者以为只要类里有 main 方法,JAR 就能跑 —— 实际上 JVM 完全不扫描 class 文件,它只读 MANIFEST.MF。哪怕你把 Main-Class 写错一个字母,或者多了一个不可见的 Unicode 空格,都会静默失败。











