修復 Spring Boot 中的 No Main Manifest 屬性
一、概述
每當我們在 Spring Boot 可執行文件 jar 中遇到“no main manifest attribute”
消息時,那是因為我們缺少文件MANIFEST.MF
中Main-Class
元數據屬性的聲明,該文件位於META-INF
文件夾下。
在這個簡短的教程中,我們將了解問題的原因以及解決方法。
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.添加插件
在這種情況下,最常見的問題是我們錯過了將[spring-boot-maven-plugin](https://search.maven.org/search?q=a:spring-boot-maven-plugin "spring-boot-maven-插件")
聲明添加到我們的pom.xml
文件中。
讓我們使用plugins
標籤下的Main-Class
聲明將plugin
定義添加到我們的pom.xml
中:
<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 插件執行目標
讓我們將repackage
目標添加到configuration
標記之後的spring-boot-maven-plugin
聲明中:
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
3.3. Maven 屬性和內聯命令執行目標
或者,將屬性start-class
添加到我們的pom.xml
文件的properties
標記中,可以在構建過程中提供更大的靈活性:
<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 上可用。