修复 Spring no main manifest 属性

1. 概述

每当我们在 Spring Boot 可执行 jar 中遇到“no main manifest 属性”消息时,都是因为我们缺少文件 MANIFEST 中 Main-Class 元数据属性的声明。MF,位于 META-INF 文件夹下。

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

2. 问题发生时

一般来说,如果我们从Spring Initializr中获取我们的pom,我们不会有任何问题。但是,如果我们通过将 spring-boot-starter-parent 添加到我们的 pom.xml 来手动构建我们的项目,我们可能会遇到这个问题。我们可以通过尝试 jar 的干净构建来复制它:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">$ mvn clean package</code>Copy</span></span>

运行 jar 时会遇到错误:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">$ java -jar target\spring-boot-artifacts-2.jar</code>Copy</span></span>
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-bash">no main manifest attribute, <span style="color:#63b175">in</span> target\spring-boot-artifacts-2.jar</code>Copy</span></span>

在此示例中,清单的内容。MF 文件是:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-xml">Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: Baeldung
Build-Jdk: 11.0.13</code>Copy</span></span>

3. 使用 Maven 插件修复

3.1. 添加插件

在这种情况下,最常见的问题是我们错过了将 spring-boot-maven-plugin 声明添加到我们的 pom.xml 文件中。

让我们将插件定义添加到我们的pom中.xml插件标签下使用Main-Class声明:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-xml"><<span style="color:#63b175">plugins</span>>
    <<span style="color:#63b175">plugin</span>>
        <<span style="color:#63b175">groupId</span>>org.springframework.boot</<span style="color:#63b175">groupId</span>>
        <<span style="color:#63b175">artifactId</span>>spring-boot-maven-plugin</<span style="color:#63b175">artifactId</span>>
        <<span style="color:#63b175">configuration</span>>
            <<span style="color:#63b175">mainClass</span>>com.baeldung.demo.DemoApplication</<span style="color:#63b175">mainClass</span>>
            <<span style="color:#63b175">layout</span>>JAR</<span style="color:#63b175">layout</span>>
        </<span style="color:#63b175">configuration</span>>
    </<span style="color:#63b175">plugin</span>>
</<span style="color:#63b175">plugins</span>></code>Copy</span></span>

但是,这可能不足以解决我们的问题。重建并运行我们的 jar 后,我们可能仍然会收到“无主清单属性”消息。

让我们看看我们有什么额外的配置和替代方案来解决这个问题。

3.2. Maven插件执行目标

让我们将重新打包目标添加到 spring-boot-maven-plugin 声明中,紧跟在配置标记之后:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-xml"><<span style="color:#63b175">executions</span>>
    <<span style="color:#63b175">execution</span>>
        <<span style="color:#63b175">goals</span>>
            <<span style="color:#63b175">goal</span>>repackage</<span style="color:#63b175">goal</span>>
        </<span style="color:#63b175">goals</span>>
    </<span style="color:#63b175">execution</span>>
</<span style="color:#63b175">executions</span>></code>Copy</span></span>

3.3. Maven 属性和内联命令执行目标

或者,将属性 start-class 添加到我们的 pom.xml 文件的属性标签中,可以在构建过程中获得更大的灵活性

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-xml"><<span style="color:#63b175">properties</span>>
    <<span style="color:#63b175">start-class</span>>com.baeldung.demo.DemoApplication</<span style="color:#63b175">start-class</span>>
</<span style="color:#63b175">properties</span>></code>Copy</span></span>

现在,我们必须使用 Maven 内联命令 spring-boot:repackage 执行目标来构建 jar:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-xml">$ mvn package spring-boot:repackage</code>Copy</span></span>

4. 检查清单。MF 文件内容

让我们应用我们的解决方案,构建 jar,然后检查清单。MF 文件。

我们注意到主类和起始类属性的存在:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-xml">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</code>Copy</span></span>

现在执行 jar,“无主清单属性”消息问题不再显示,并且应用程序运行。

5. 结论

在本文中,我们看到了如何在执行 Spring Boot 可执行 jar 时解决“无主清单属性”消息。

我们看到了如何从手动创建的pom.xml文件中获得这一点,以及如何添加和配置Spring Maven插件来修复它。

与往常一样,示例代码可在 GitHub 上找到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值