运行 java -jar 时无法加载 Main-Class 清单属性
Posted
技术标签:
【中文标题】运行 java -jar 时无法加载 Main-Class 清单属性【英文标题】:Failed to load Main-Class manifest attribute while running java -jar 【发布时间】:2013-11-06 08:55:52 【问题描述】:我已经通过关注this tutorial 成功地使用mvn clean package
构建了我的Spring MVC 项目。
现在我正在尝试使用以下方式运行服务:
mvn clean package && java -jar target/gs-serving-web-content-0.1.0.jar
但我收到此错误:
加载主类清单属性失败 目标/gs-serving-web-content-0.1.0.jar
我错过了什么吗?
【问题讨论】:
见***.com/questions/574594/… 【参考方案1】:如果您使用的是 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>
Reference Guide | Spring Boot Maven Plugin
【讨论】:
简单地添加上面的代码并使用mvn package
对我不起作用。我不得不使用 mvn package spring-boot:repackage
,它创建了独立的应用程序。
当我这样做时,我的集成测试由于 NoClassDeff 而失败...添加 mvn package spring-boot:repackage
解决了我的问题。感谢上面附上的文档。
mvn 包对我有用。我不必做 mvn spring-boot:repackage。我在 mac os 上使用 spring-boot 1.5.9.RELEASE + java 8。如果你有做 mvn spring-boot:repackage,那么不需要在你的 pom.xml 中添加 repackage 目标。在 pom.xml 中添加 repackage 目标的全部意义在于,当您调用 mvn package 时,maven 会自动调用 spring-boot:package。
从 spring-boot-starter-parent 继承不是义务。尤其是在大型项目中,开发人员使用自己的父 pom 来管理依赖项和控制 jar hell。【参考方案2】:
您可能缺少 Spring Boot Maven 插件。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
【讨论】:
【参考方案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>
【讨论】:
【参考方案4】:检查顺序
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
应该在上面
dockerfile-maven-plugin 否则会重新打包
这解决了我的清单中没有主要属性的问题。
【讨论】:
【参考方案5】:您缺少maven-jar-plugin
,您需要在其中添加manifest
标签。
【讨论】:
【参考方案6】:对于 spring boot,我在 META-INF 文件夹中创建了一个 MANIFEST.MF 文件。
在我的 STS IDE 中,我将 META-INFO 文件夹放在 src/main/resources 文件夹中 像这样:
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/
-
每次提到“bankim”/“Bankim”都是指我的项目名称,所以用你的项目名称替换它
特别注意“Start-Class”值。它应该包含具有您的 main 方法的类的“路径”。
行:
主类:org.springframework.boot.loader.JarLaunchers 应该保持原样。
****以上清单是使用“Mradul Pandey”上面提到的“spring-boot-maven-plugin”为我创建的(2015 年 9 月 2 日 4:50 回答)
希望对你有帮助
【讨论】:
您不应手动执行此操作。正确配置后,spring-boot 插件会为您创建它。令人费解的是,并非相同的解决方案适用于每个人。我必须将执行部分添加到插件中,例如否则失败。 我没有手动创建它,(参见步骤 3 中提到的)。但是,是的,不确定是什么原因造成的。好久不见……【参考方案7】:java -jar target/gs-serving-web-content-0.1.0.jar
命令假定提供的 jar 是可执行的。在 executable jar 中,main
方法在 MANIFEST.MF
文件中定义。假设您没有MANIFEST.MF
文件,可以传递一个额外的命令行参数来指定包含main
方法的类。
像java -cp target/gs-serving-web-content-0.1.0.jar com.pkg.subpkg.MainClass
这样的命令可以达到目的。
【讨论】:
【参考方案8】:我有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>
很高兴去!
【讨论】:
【参考方案9】:使用spring-boot-maven-plugin
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
并确保在 pom.xml 中设置 property start-class
<properties>
<!-- The main class to start by executing "java -jar" -->
<start-class>org.example.DemoApplication</start-class>
</properties>
或者,可以在 pom.xml 的插件部分中将主类定义为 spring-boot-maven-plugin 的 mainClass 元素:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>spring-boot</classifier>
<mainClass>$start-class</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
【讨论】:
【参考方案10】:如果你的插件配置和我的一样(below
),那么请使用mvn package spring-boot:repackage
。
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
快乐学习。
【讨论】:
【参考方案11】:您需要在 MANIFEST.MF 文件中设置您的主类:
Main-Class: com.example.MainClassApplication
【讨论】:
【参考方案12】:你可以使用
mvn package spring-boot:repackage
在目标目录之前点击这个命令 然后使用jar文件
.
【讨论】:
以上是关于运行 java -jar 时无法加载 Main-Class 清单属性的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.IllegalStateException:运行 Junit 测试用例时无法加载 ApplicationContext
编译没问题,cmd下运行java类文件时,提示:找不到或无法加载主类