您好,登录后才能下订单哦!
# 如何解决SpringBoot打包jar运行时提示没有主清单属性问题
## 引言
在使用SpringBoot开发项目时,我们经常会遇到将项目打包成可执行JAR文件的需求。然而,有时在执行`java -jar your-application.jar`命令时,可能会遇到"没有主清单属性"(`no main manifest attribute`)的错误提示。这个错误通常会让开发者感到困惑,特别是对于刚接触SpringBoot的新手来说。本文将深入分析这个问题的成因,并提供多种解决方案,帮助开发者彻底解决这一常见问题。
## 问题现象与错误分析
### 错误表现
当尝试运行SpringBoot打包生成的JAR文件时,控制台可能会显示如下错误信息:
Error: no main manifest attribute, in your-application.jar
或者更详细的版本:
java -jar target/demo-0.0.1-SNAPSHOT.jar
没有主清单属性
### 错误原因分析
这个错误的根本原因是JAR文件的`MANIFEST.MF`文件中缺少`Main-Class`属性,或者该属性指向的类不正确。在Java中,可执行JAR文件需要通过`MANIFEST.MF`文件中的`Main-Class`属性来指定程序的入口点。
对于SpringBoot应用,正确的`Main-Class`应该指向`org.springframework.boot.loader.JarLauncher`(对于可执行JAR)或`org.springframework.boot.loader.PropertiesLauncher`(对于需要外部配置的特殊情况),同时还需要指定`Start-Class`属性指向你的实际应用主类(通常是带有`@SpringBootApplication`注解的类)。
## 解决方案
### 方案一:使用SpringBoot Maven插件正确打包
最推荐的方式是确保正确配置了`spring-boot-maven-plugin`插件。这是SpringBoot官方提供的解决方案。
#### 1. 检查pom.xml配置
确保你的`pom.xml`文件中包含以下插件配置:
```xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.0</version> <!-- 使用你的SpringBoot版本 -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用以下Maven命令进行打包:
mvn clean package
打包完成后,检查target
目录下生成的JAR文件。SpringBoot会生成两个JAR文件:
- your-application-0.0.1-SNAPSHOT.jar
- 可执行的”fat jar”
- your-application-0.0.1-SNAPSHOT.jar.original
- 原始的普通JAR
你应该运行带有spring-boot
重打包的可执行JAR(即不带.original
后缀的那个)。
如果由于某些原因不能使用spring-boot-maven-plugin
,可以手动配置maven-jar-plugin
来指定主类。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.yourpackage.YourApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
这种方法生成的JAR不是SpringBoot的”fat jar”,不会包含依赖项。要运行这种JAR,你需要确保所有依赖都在classpath中,或者使用java -cp
命令指定classpath。
有时项目中其他插件或配置可能会干扰SpringBoot的正常打包过程。常见问题包括:
maven-assembly-plugin
或maven-shade-plugin
可能与spring-boot-maven-plugin
冲突解决方案是检查并简化构建配置,确保spring-boot-maven-plugin
能够正常工作。
对于使用Gradle构建的项目,也需要正确配置SpringBoot插件:
plugins {
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
bootJar {
manifest {
attributes 'Main-Class': 'org.springframework.boot.loader.JarLauncher'
attributes 'Start-Class': 'com.yourpackage.YourApplication'
}
}
./gradlew bootJar
有时问题可能出在IDE的运行配置上,而非打包过程本身。例如:
为了更好地解决和预防这类问题,了解SpringBoot的打包机制很有帮助。
SpringBoot的可执行JAR(也称为”fat jar”)采用了一种特殊结构:
example.jar
|
+-META-INF/
| +-MANIFEST.MF
+-org/
| +-springframework/
| +-boot/
| +-loader/
| +-<spring boot loader classes>
+-BOOT-INF/
+-classes/
| +-your application classes
+-lib/
+-dependency jars
正确的SpringBoot可执行JAR的MANIFEST.MF文件应包含以下关键属性:
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.yourpackage.YourApplication
Spring-Boot-Version: 2.7.0
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
JarLauncher
是SpringBoot的特殊类加载器,它负责:
- 定位BOOT-INF/classes
中的应用类
- 加载BOOT-INF/lib
中的依赖JAR
- 最终启动Start-Class
指定的应用主类
可以使用以下命令查看JAR的清单文件:
unzip -p your-application.jar META-INF/MANIFEST.MF
或者使用Java的jar
命令:
jar tf your-application.jar META-INF/MANIFEST.MF
如果解决了主清单属性问题后出现ClassNotFound错误,可能是: - 没有正确生成”fat jar”(缺少依赖) - 使用了错误的JAR文件(运行了.original文件) - 依赖没有正确打包
在多模块项目中,确保:
- 主应用模块正确配置了spring-boot-maven-plugin
- 父POM没有干扰子模块的打包配置
- 依赖模块正确声明为<dependency>
如果需要更灵活的类加载方式,可以配置使用PropertiesLauncher
:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>org.springframework.boot.loader.PropertiesLauncher</mainClass>
<layout>ZIP</layout>
</configuration>
</plugin>
可以添加自定义的MANIFEST属性:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addBuildEnvironmentEntries>true</addBuildEnvironmentEntries>
</manifest>
</configuration>
</plugin>
“没有主清单属性”错误是SpringBoot项目打包过程中的常见问题,通常是由于不正确的打包配置导致的。通过本文介绍的多种解决方案,你应该能够:
记住,对于标准的SpringBoot项目,最简单可靠的解决方案始终是正确配置spring-boot-maven-plugin
或spring-boot-gradle-plugin
,并确保使用它们生成的”fat jar”来运行应用。
命令 | 描述 |
---|---|
mvn clean package |
标准打包命令 |
java -jar target/your-app.jar |
运行SpringBoot应用 |
jar tf your-app.jar |
列出JAR文件内容 |
unzip -p your-app.jar META-INF/MANIFEST.MF |
查看清单文件内容 |
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。