spring-boot-maven插件repackage(goal)的那些事

本文详细解析了在Spring Boot项目中使用spring-boot-maven-plugin时,repackage目标的作用,比较了启用和禁用插件后的打包过程,揭示了它如何整合依赖、代码和启动资源,以及为何会额外生成一个.original文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在打包Springboot项目成jar包时需要在pom.xml使用spring-boot-maven-plugin来增加Maven功能,在我的上一篇博客<<Maven生命周期和插件的那些事(2021版)>>中已经介绍过Maven和插件的关系,在此不再赘述,感兴趣的小伙伴可以点击链接了解下。那么到底spring-boot-maven插件到底增加了哪些功能并没有深入探讨,下面针对Maven的package命令,分使用和不适用spring-boot-maven插件两种情境下的控制台输出和jar包组成简单讨论下。

以下两张图的文字描述和控制台输出可以得出:运行mvn package命令时,使用spring-boot-maven插件的打包过程比没有使用spring-boot-maven插件多了一次repackage过程,下面简单记录下repackage到底干了哪些工作?

一、首先对比下打包的成果物:

可以发现使用spring-boot-maven-plugin插件的比没有使用的场景,多了一个以.original结尾的文件,且该文件的大小与没使用spring-boot-maven插件打包的jar文件大小一样。下面对这两个大小一样的文件解压缩,解压后内容如下,可以看到解压后的内容无论是大小还是目录结构以及目录下的内容都一样。

对此我们可以得出第一个结论:spring-boot-maven-plugin的package(goal)将Maven的package命令默认实现(jar:jar)打包的重命名为XXX.jar.original

二、下面开始分析由spring-boot-maven插件打包的jar包结构如下:

BOOT-INF目录下有两个子目录:classes和lib目录。lib目录存放的是应用依赖的jar包,具体参照Maven的pom.xml中的依赖内容。classes目录下存放的是项目CLASS_PATH下的内容,包括应用代码和配置文件(比如application.yml等),可以理解为repackage将原始Maven打包的jar文件中的除META-INF以外的内容放置到该目录下打包。

META-INF目录下存放的是应用相关的元信息,比如JAR包的必要配置文件MANIFEST.MF和Maven的配置文件等。

org目录下放置的与springboot应用jar加载和启动相关的类,后期会有博客专门讲解springboot应用的启动过程,会重点分析spring-boot-loader的。

根据以上控制台日志输出以及有无spring-boot-maven插件下打包形成的jar包组成可以推断,spring-boot-maven插件的repackage(goal)有如下两个作用:

1、在原始Maven打包形成的jar包基础上,进行重新打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),以此来满足Springboot独立应用的特性;

2、将原始Maven打包的jar重命名为XXX.jar.original作为原始文件;

以上,完了!

 

<think>嗯,用户遇到了使用Spring Boot Maven Plugin 2.5.5时,执行repackage失败并提示“Unable to find main class”的问题。我需要先了解这个错误的常见原因。根据之前收集的资料,这可能与主类配置不正确、插件版本不兼容或项目结构问题有关。 首先,用户需要检查主类是否正确定义。主类应该包含main方法,并且在pom.xml中通过<start-class>属性指定,或者在MANIFEST.MF中声明。如果主类路径错误,插件就无法找到,导致打包失败。此外,如果项目是多模块的,可能需要确认主模块是否正确配置。 接下来,插件版本也是一个关键因素。引用[2]和[3]提到,高版本插件可能存在不兼容的情况,尤其是从2.x升级到3.x时,部分配置项可能被移除。用户使用的是2.5.5,可能需要尝试升级到更稳定的版本,比如2.7.5,或者降低版本到2.5.2,如引用[4]所述。另外,确保父pom中的spring-boot-starter-parent版本与插件版本一致,避免版本冲突。 项目结构问题也可能导致此错误。需要检查IDEA中的Facets设置,确保Spring和Web配置正确,并且修复任何错误。同时,Maven的配置是否正确,比如JDK版本是否匹配,依赖是否完整。执行mvn clean install清理旧构建,重新生成可能有助于解决问题。 另外,用户可能在多模块项目中,主类位于子模块中,这时需要在子模块的pom中配置插件,并确保主类路径正确。如果主类在依赖的jar中,可能需要调整插件配置,确保能够正确扫描到。 综合以上因素,建议用户逐步排查:检查主类配置、调整插件版本、清理项目并重建,以及验证项目结构。如果问题依旧,可能需要更详细的日志分析,启用Maven-X参数查看详细错误信息,进一步定位问题根源。</think>### 解决 `spring-boot-maven-plugin:2.5.5 repackage` 失败(找不到主类)的步骤 #### 1. **确认主类配置** - **主类定义**:确保项目中存在包含 `public static void main(String[] args)` 方法的主类,且路径与包名一致。例如: ```java package com.example.demo; public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` - **`pom.xml` 配置**:在插件配置中显式指定主类: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.5.5</version> <configuration> <mainClass>com.example.demo.Application</mainClass> </configuration> </plugin> ``` 若未指定,插件会尝试自动扫描,但可能因包路径复杂而失败[^1][^4]。 #### 2. **检查插件与父版本兼容性** - **父项目版本**:确保 `spring-boot-starter-parent` 的版本与插件兼容。例如: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <!--插件版本一致 --> </parent> ``` 若父版本过高(如2.6.x或3.x),可能导致兼容性问题。可尝试降级到2.5.2(参考引用[4])。 #### 3. **清理并重建项目** - 执行以下命令清理旧构建并重新编译: ```bash mvn clean install -U ``` 此操作会强制更新依赖并重新生成 `target/classes` 目录,修复因缓存导致的主类丢失问题。 #### 4. **验证项目结构** - **IDEA 配置**:在 IntelliJ IDEA 中: 1. 检查 **Project Structure > Facets**,确保 Spring 和 Web 模块配置正确。 2. 通过 **Build > Rebuild Project** 强制重建。 3. 确认 **Artifacts** 配置中包含主类和依赖项。 - **多模块项目**:若主类位于子模块中,需在子模块的 `pom.xml` 中配置插件,而非父模块。 #### 5. **尝试升级/降级插件版本** - 若上述步骤无效,可尝试以下版本组合: ```xml <!-- 方案1:升级到稳定版本 --> <plugin> <version>2.7.5</version> </plugin> ``` ```xml <!-- 方案2:降级到兼容版本 --> <plugin> <version>2.5.2</version> </plugin> ``` 版本冲突是常见原因(参考引用[2][3][4])。 --- ### 相关问题 1. **如何排查 Maven 插件版本冲突?** - 使用 `mvn dependency:tree` 分析依赖树,检查是否有其他插件覆盖了 Spring Boot 插件的配置。 2. **Spring Boot 3.x 与旧版插件有何差异?** - Spring Boot 3.x 移除了部分旧 API(如 `goal` 配置),需同步升级插件版本(参考引用[3])。 3. **`MANIFEST.MF` 中未生成主类信息怎么办?** - 检查 `maven-jar-plugin` 配置是否冲突,或手动指定主类路径。 --- 通过以上步骤,可系统性定位并解决 `Unable to find main class` 问题。若仍失败,可添加 `-X` 参数查看详细日志(如 `mvn -X package`)。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值