直接使用 java -jar 运行可执行 Jar 文件时不需要手动指定主类,前提是该 Jar 文件的 META-INF/MANIFEST.MF 中已正确声明 Main-Class 属性;否则会报 “no main manifest attribute” 错误。

直接使用 java -jar 运行可执行 Jar 文件时,**不需要手动指定主类**——前提是该 Jar 文件的 META-INF/MANIFEST.MF 文件中已正确声明了 Main-Class 属性。这是 Java 可执行 Jar 的标准机制。
确保 Jar 包含正确的 MANIFEST.MF 配置
可执行 Jar 必须在清单文件中指明启动类,否则 java -jar 会报错 “no main manifest attribute”。构建时需确保:
- 使用 Maven(如
maven-jar-plugin)时,在pom.xml中配置<mainClass>com.example.Main</mainClass> - 使用 Gradle 时,在
jar { manifest { attributes 'Main-Class': 'com.example.Main' } }中设置 - 手动打包时,用
jar cfm myapp.jar MANIFEST.MF *.class,其中MANIFEST.MF至少包含一行:
Main-Class: com.example.Main
运行命令格式(无需额外参数)
只要 Jar 是可执行的(即含有效 Main-Class),直接运行即可:
java -jar myapp.jar
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Java 启动器会自动读取清单中的 Main-Class,加载并调用其 public static void main(String[] args) 方法。
如果想临时覆盖主类(不推荐日常使用)
java -jar 本身不支持运行时替换 Main-Class。若需指定其他入口类,必须改用传统方式:
java -cp myapp.jar com.other.Main
注意:此时 -cp(或 -classpath)代替了 -jar,JVM 不再读取 Jar 内的清单,而是显式加载指定类。要求该类在 Jar 的根路径下可访问,且依赖已全部包含在 classpath 中(如引用了第三方库,需一并加入 -cp)。
常见问题排查
-
“no main manifest attribute”:Jar 缺少
Main-Class声明,检查META-INF/MANIFEST.MF是否存在且格式正确(冒号后有空格,末尾有空行) -
“Could not find or load main class”:主类名拼写错误、包路径不匹配,或类未被正确打包进 Jar;可用
jar -tf myapp.jar | grep Main确认类文件路径是否为com/example/Main.class -
运行时报 NoClassDefFoundError:依赖未打入 Jar(非 fat-jar),需用
-cp显式引入依赖 Jar,或改用spring-boot-maven-plugin等工具生成可执行胖包


















