运行可执行Jar时出现No main manifest attribute问题求助
我太懂这种明明检查了所有配置却还是卡壳的烦躁了——你已经试过重建Jar、调整pom配置,也确认了MANIFEST.MF里的主类路径,却还是栽在这个错误上。结合你给出的配置,我帮你梳理几个容易被忽略的关键排查点:
一、补全Spring Boot Maven插件的核心配置
你当前的pom.xml里的Spring Boot插件只有基础的groupId和artifactId,缺少了绑定打包核心目标的配置,这会导致插件根本没起到生成可执行Jar的作用。建议把插件配置修改为:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
repackage是Spring Boot插件的核心功能,它会把普通Jar重新打包成包含所有依赖、且带有正确manifest信息的可执行Jar,没有这个配置的话,插件相当于空跑,不会生成符合要求的Jar包。
二、核对MANIFEST.MF的格式细节
你提到文件里已经有Main-Class,但这个文件的格式有严格要求,一点点小问题都会导致JVM无法识别:
- 每一行结尾必须是换行符(LF),尽量避免Windows的CRLF格式(部分场景下会解析失败)
Main-Class的冒号后面必须有一个空格,也就是Main-Class: xxxxxxxx.xxxxxxxxxxxxxApplication,不能省略这个空格- 文件的最后一行必须是空行,否则最后一行的配置会被JVM忽略
你可以打开MANIFEST.MF仔细核对这几点,有时候看起来正确的内容,格式上的小疏漏就是问题根源。
三、确认打包命令的正确性
一定要用mvn clean package或者mvn clean install来打包,别用mvn jar:jar——后者只会生成普通Jar,不会触发Spring Boot插件的repackage操作,自然不会生成带有正确manifest属性的可执行Jar。
另外,打包完成后可以看看target目录下的Jar体积:Spring Boot的可执行Jar因为包含了所有依赖,通常会比普通Jar大很多,如果你的Jar体积很小,大概率是没正确打包成可执行版本。
四、手动指定主类(兜底方案)
如果上面的方法都没解决问题,可以在插件里手动指定主类,避免自动扫描出错:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>xxxxxxxx.xxxxxxxxxxxxxApplication</mainClass> </configuration> </plugin>
把xxxxxxxx.xxxxxxxxxxxxxApplication换成你实际的主类全路径,这样插件会强制用这个类生成manifest信息。
内容的提问来源于stack exchange,提问作者Yoav Tanzman

