1. 概述
当我们遇到Spring Boot可执行jar文件中的"no main manifest attribute"
消息时,通常是由于我们在META-INF
文件夹下的MANIFEST.MF
文件中遗漏了Main-Class
元数据属性的声明。
在这个简短教程中,我们将关注这个问题的原因以及如何解决。
2. 问题出现的情况
通常,如果我们从Spring Initializr获取pom
文件,就不会遇到问题。但如果我们手动添加spring-boot-starter-parent
到pom.xml
中来构建项目,可能会遇到这个问题。我们可以通过尝试清理并重新构建jar来重现它:
$ mvn clean package
运行jar时,我们会遇到错误:
$ java -jar target\spring-boot-artifacts-2.jar
no main manifest attribute, in target\spring-boot-artifacts-2.jar
在这个例子中,MANIFEST.MF
文件的内容是:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: Baeldung
Build-Jdk: 11.0.13
3. 使用Maven插件修复
3.1. 添加插件
在这种情况下,最常见的问题是我们在pom.xml
文件中漏掉了spring-boot-maven-plugin
的声明。
我们将把plugin
定义添加到pom.xml
中,将Main-Class
声明放在plugins
标签下:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.baeldung.demo.DemoApplication</mainClass>
<layout>JAR</layout>
</configuration>
</plugin>
</plugins>
然而,这可能不足以解决我们的问题。重建并运行jar后,我们仍然可能会收到"no main manifest attribute"
消息。
让我们看看还有哪些额外的配置和解决方案可以解决这个问题。
3.2. Maven插件执行目标
在spring-boot-maven-plugin
声明的configuration
标签之后,添加repackage
目标:
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
3.3. Maven属性与内联命令执行目标
另一种选择是,在pom.xml
文件的properties
标签中添加start-class
属性,这样在构建过程中提供了更大的灵活性:
<properties>
<start-class>com.baeldung.demo.DemoApplication</start-class>
</properties>
现在我们需要使用Maven内联命令spring-boot:repackage
执行目标来构建jar:
$ mvn package spring-boot:repackage
4. 检查MANIFEST.MF
文件内容
应用我们的解决方案,构建jar,然后检查MANIFEST.MF
文件。
我们会注意到Main-Class
和Start-Class
属性的存在:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: Baeldung
Build-Jdk: 11.0.13
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.baeldung.demo.DemoApplication
Spring-Boot-Version: 2.7.5
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
现在执行jar,"no main manifest attribute"
消息问题不再出现,应用程序可以正常运行。
5. 总结
在这篇文章中,我们了解了如何解决执行Spring Boot可执行jar时的"no main manifest attribute"
消息问题。
我们演示了这个问题是如何因手动创建的pom.xml
文件而产生的,以及如何添加和配置Spring Maven插件来修复它。
如往常一样,示例代码可以在GitHub上找到。