1. 概述

当我们遇到Spring Boot可执行jar文件中的"no main manifest attribute"消息时,通常是由于我们在META-INF文件夹下的MANIFEST.MF文件中遗漏了Main-Class元数据属性的声明。

在这个简短教程中,我们将关注这个问题的原因以及如何解决。

2. 问题出现的情况

通常,如果我们从Spring Initializr获取pom文件,就不会遇到问题。但如果我们手动添加spring-boot-starter-parentpom.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-ClassStart-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上找到。