如何解决SpringBoot打包jar运行时提示没有主清单属性问题

发布时间:2021-09-29 17:05:20 作者:柒染
来源:亿速云 阅读:296
# 如何解决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>

2. 执行正确的打包命令

使用以下Maven命令进行打包:

mvn clean package

3. 验证生成的JAR文件

打包完成后,检查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后缀的那个)。

方案二:手动指定MANIFEST.MF属性

如果由于某些原因不能使用spring-boot-maven-plugin,可以手动配置maven-jar-plugin来指定主类。

1. 配置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>

2. 注意事项

这种方法生成的JAR不是SpringBoot的”fat jar”,不会包含依赖项。要运行这种JAR,你需要确保所有依赖都在classpath中,或者使用java -cp命令指定classpath。

方案三:检查构建过程是否被干扰

有时项目中其他插件或配置可能会干扰SpringBoot的正常打包过程。常见问题包括:

  1. 其他打包插件冲突:如maven-assembly-pluginmaven-shade-plugin可能与spring-boot-maven-plugin冲突
  2. 自定义的打包配置:覆盖了SpringBoot的默认配置
  3. 多模块项目中的父POM配置:父POM中的配置可能影响子模块的打包

解决方案是检查并简化构建配置,确保spring-boot-maven-plugin能够正常工作。

方案四:Gradle项目的解决方案

对于使用Gradle构建的项目,也需要正确配置SpringBoot插件:

1. 确保应用了SpringBoot插件

plugins {
    id 'org.springframework.boot' version '2.7.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

2. 配置bootJar任务

bootJar {
    manifest {
        attributes 'Main-Class': 'org.springframework.boot.loader.JarLauncher'
        attributes 'Start-Class': 'com.yourpackage.YourApplication'
    }
}

3. 执行正确的Gradle命令

./gradlew bootJar

方案五:检查IDE运行配置

有时问题可能出在IDE的运行配置上,而非打包过程本身。例如:

  1. IntelliJ IDEA:检查运行配置是否正确地指向了SpringBoot主类
  2. Eclipse:确保使用了正确的启动方式

深入理解SpringBoot打包机制

为了更好地解决和预防这类问题,了解SpringBoot的打包机制很有帮助。

1. SpringBoot的可执行JAR结构

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

2. MANIFEST.MF文件内容

正确的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/

3. SpringBoot的JarLauncher机制

JarLauncher是SpringBoot的特殊类加载器,它负责: - 定位BOOT-INF/classes中的应用类 - 加载BOOT-INF/lib中的依赖JAR - 最终启动Start-Class指定的应用主类

常见问题排查

1. 如何检查JAR文件的MANIFEST.MF内容?

可以使用以下命令查看JAR的清单文件:

unzip -p your-application.jar META-INF/MANIFEST.MF

或者使用Java的jar命令:

jar tf your-application.jar META-INF/MANIFEST.MF

2. 打包后运行报ClassNotFound错误

如果解决了主清单属性问题后出现ClassNotFound错误,可能是: - 没有正确生成”fat jar”(缺少依赖) - 使用了错误的JAR文件(运行了.original文件) - 依赖没有正确打包

3. 多模块项目中的特殊问题

在多模块项目中,确保: - 主应用模块正确配置了spring-boot-maven-plugin - 父POM没有干扰子模块的打包配置 - 依赖模块正确声明为<dependency>

高级场景

1. 使用PropertiesLauncher

如果需要更灵活的类加载方式,可以配置使用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>

2. 自定义MANIFEST.MF属性

可以添加自定义的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项目打包过程中的常见问题,通常是由于不正确的打包配置导致的。通过本文介绍的多种解决方案,你应该能够:

  1. 理解问题的根本原因
  2. 使用正确的SpringBoot Maven/Gradle插件配置
  3. 检查并验证生成的JAR文件
  4. 排查复杂的项目结构问题

记住,对于标准的SpringBoot项目,最简单可靠的解决方案始终是正确配置spring-boot-maven-pluginspring-boot-gradle-plugin,并确保使用它们生成的”fat jar”来运行应用。

附录

参考资源

  1. Spring Boot Maven Plugin Documentation
  2. Spring Boot Executable Jar Format
  3. Maven JAR Plugin Documentation

常用命令速查

命令 描述
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 查看清单文件内容

”`

推荐阅读:
  1. 解决layui的radio属性或别的属性没显示出来的问题
  2. Springboot jar主清单属性丢失了怎么办

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot jar包

上一篇:批处理bat如何实现全盘搜索指定文件获取其完整路径

下一篇:如何使用纯css实现footer一直在页面底部不随页面滚动

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》