运行java -jar时出现“Failed to load Main-Class manifest attribute”的错误

60

我成功地使用 mvn clean package 命令构建了我的Spring MVC项目,遵循了这个教程

现在我正在尝试使用以下命令运行该服务:

mvn clean package && java -jar target/gs-serving-web-content-0.1.0.jar

但是我遇到了这个错误:

无法从target/gs-serving-web-content-0.1.0.jar加载Main-Class清单属性

我错过了什么吗?


请参考以下链接,了解如何使用Maven创建带有依赖项的可执行JAR文件:https://dev59.com/jnRB5IYBdhLWcg3wl4Sc - user2173738
12个回答

157
如果您正在使用Spring Boot,那么这将解决您的问题:
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.2.5.RELEASE</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

参考指南 | Spring Boot Maven 插件


22
仅仅添加上述代码并使用mvn package并不能让我成功。我必须使用mvn package spring-boot:repackage,这样才能创建出独立的应用程序。 - twobeers
4
当我这样做时,我的集成测试失败了,由于出现了NoClassDefFound错误。将<phase>post-integration-test</phase>添加到执行中对我解决了这个问题。 - Gurey
2
mvn package spring-boot:repackage解决了我的问题。感谢您提供的上述文档。 - mainframer
1
mvn package 对我来说有效。我不需要执行 mvn spring-boot:repackage。我在 Mac OS 上使用 spring-boot 1.5.9.RELEASE + java 8。如果您已经执行了 mvn spring-boot:repackage,则无需在 pom.xml 中添加 repackage 目标。将 repackage 目标添加到 pom.xml 的整个目的是,当您调用 mvn package 时,maven 将自动调用 spring-boot:package。 - user674669
如果您正确继承自spring-boot-starter-parent,那么您就不必执行repackage步骤。 - rustyx
1
没有必要继承spring-boot-starter-parent。特别是在大型项目中,开发人员会使用自己的父POM来管理依赖项和控制jar冲突。 - Mradul Pandey

21

你可能缺少Spring Boot Maven插件。

<plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

3

检查顺序

<plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

应该在dockerfile-maven-plugin之前执行,否则会重新打包。

这解决了我的manifest中没有主属性的问题。


3
你需要在pom.xml文件中指定它 - 这将使你的jar包包含所有依赖项并可执行(用your.main.class替换即可):
<!-- setup jar manifest to executable with dependencies -->
<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifest>
        <mainClass>your.main.class</mainClass>
      </manifest>
    </archive>
  </configuration>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
       <goal>single</goal>
      </goals>  
    </execution>
  </executions>
</plugin>

1
你缺少 maven-jar-plugin,需要添加 manifest 标签。

1

java -jar target/gs-serving-web-content-0.1.0.jar 命令假定提供的 jar 文件是 可执行 的。在一个 可执行 的 jar 文件中,main 方法被定义在 MANIFEST.MF 文件中。鉴于您没有 MANIFEST.MF 文件,可以传递额外的命令行参数来指定包含 main 方法的类。

java -cp target/gs-serving-web-content-0.1.0.jar com.pkg.subpkg.MainClass 这样的命令就可以达到目的。


1
对于Spring Boot,我已经在META-INF文件夹内创建了一个MANIFEST.MF文件。
在我的STS IDE中,我将META-INFO文件夹放置在src/main/resources文件夹中。

screenshot from STS IDE (eclipse project)

MANIFEST.MF文件的内容:

Manifest-Version: 1.0
Implementation-Title: bankim
Implementation-Version: 1.5.6.RELEASE
Archiver-Version: Plexus Archiver
Built-By: Yourname
Implementation-Vendor-Id: com.bankim
Spring-Boot-Version: 1.5.6.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.bankim.BankimApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Implementation-URL: http://projects.spring.io/spring-boot/bankim/
  1. "bankim" / "Bankim" 的每次提到都指代我的项目名称,请将其替换为您的项目名称
  2. 特别注意“Start-Class”值。它应该包含具有主要方法的类的“路径”。
  3. 行:Main-Class: org.springframework.boot.loader.JarLaunchershould 应保持原样。

****以上清单是使用“spring-boot-maven-plugin”由“Mradul Pandey”(于2015年9月2日4:50回答)创建的。

希望这可以帮助你


你不应该手动操作。当正确配置spring-boot插件时,它会自动生成这个过程。然而令人困惑的是,并非每个人都适用同样的解决方案。例如,我必须向插件添加executions部分,否则它就会失败。 - Lawrence
我没有手动创建它(请参见第3步)。但是我不确定是什么导致了这个问题。已经过了一段时间... - Dror

0

你需要在 MANIFEST.MF 文件中设置你的主类:

Main-Class: com.example.MainClassApplication

0

我已经使用了spring-boot-maven-plugin,但仍然出现了关于主类的错误。

<plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

最后我不得不使用 maven-jar-plugin 并添加 mainClass
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <archive>
            <manifest>
            <mainClass>com.org.proj.App</mainClass>
            </manifest>
          </archive>
        </configuration>
    </plugin>

一切就绪,可以开始了!


0

你可以使用

mvn package spring-boot:repackage

在 target 目录之前输入该命令,然后使用 jar 文件。

.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接