修復(fù) Spring no main manifest 屬性
概述
每當(dāng)我們?cè)?Spring Boot 可執(zhí)行 jar 中遇到*“no main manifest 屬性”*消息時(shí),都是因?yàn)槲覀內(nèi)鄙傥募?MANIFEST 中 Main-Class 元數(shù)據(jù)屬性的聲明*。MF,位于?*META-INF 文件夾下。
在這個(gè)簡短的教程中,我們將介紹問題的原因以及如何解決它。
2. 問題發(fā)生時(shí)
一般來說,如果我們從Spring Initializr中獲取我們的*pom*,我們不會(huì)有任何問題。但是,如果我們通過將 spring-boot-starter-parent 添加到我們的 pom.xml 來手動(dòng)構(gòu)建我們的項(xiàng)目,我們可能會(huì)遇到這個(gè)問題。我們可以通過嘗試 jar 的干凈構(gòu)建來復(fù)制它:
$ mvn clean package
運(yùn)行 jar 時(shí)會(huì)遇到錯(cuò)誤:
$ java -jar target\spring-boot-artifacts-2.jar
no main manifest attribute, in target\spring-boot-artifacts-2.jar
在此示例中,清單的內(nèi)容。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 插件修復(fù)
3.1. 添加插件
在這種情況下,最常見的問題是我們錯(cuò)過了將 spring-boot-maven-plugin 聲明添加到我們的 pom.xml 文件中。
讓我們將插件定義添加到我們的pom中.xml在插件標(biāo)簽下使用Main-Class聲明:
<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>
但是,這可能不足以解決我們的問題。重建并運(yùn)行我們的 jar 后,我們可能仍然會(huì)收到*“無主清單屬性”*消息。
讓我們看看我們有什么額外的配置和替代方案來解決這個(gè)問題。
3.2. Maven插件執(zhí)行目標(biāo)
讓我們將重新打包*目標(biāo)添加到 *spring-boot-maven-plugin 聲明中,緊跟在配置標(biāo)記之后:
<executions>
? ?<execution>
? ? ? ?<goals>
? ? ? ? ? ?<goal>repackage</goal>
? ? ? ?</goals>
? ?</execution>
</executions>
3.3. Maven 屬性和內(nèi)聯(lián)命令執(zhí)行目標(biāo)
或者,將屬性?start-class?添加到我們的?pom.xml?文件的屬性標(biāo)簽中,可以在構(gòu)建過程中獲得更大的靈活性:
<properties>
? ?<start-class>com.baeldung.demo.DemoApplication</start-class>
</properties>
現(xiàn)在,我們必須使用 Maven 內(nèi)聯(lián)命令 spring-boot:repackage 執(zhí)行目標(biāo)來構(gòu)建 jar:
$ mvn package spring-boot:repackage
4. 檢查清單。MF?文件內(nèi)容
讓我們應(yīng)用我們的解決方案,構(gòu)建 jar,然后檢查清單。MF 文件。
我們注意到主類和起始類屬性的存在:
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
現(xiàn)在執(zhí)行 jar,*“無主清單屬性”*消息問題不再顯示,并且應(yīng)用程序運(yùn)行。
5. 結(jié)論
在本文中,我們看到了如何在執(zhí)行 Spring Boot 可執(zhí)行 jar 時(shí)解決*“無主清單屬性”*消息。
我們看到了如何從手動(dòng)創(chuàng)建的pom.xml文件中獲得這一點(diǎn),以及如何添加和配置Spring Maven插件來修復(fù)它。
與往常一樣,示例代碼可在 GitHub 上找到。