聚合maven+spring-boot打包可执行jar

本文详细介绍了在使用Maven聚合项目与Spring Boot时,如何正确打包可执行jar文件的过程及遇到的问题。包括spring-boot-maven-plugin打包的不可依赖问题、jdk8版本指定的重要性以及BOOT-INF陷阱等。

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

转载于: https://blog.youkuaiyun.com/guduyishuai/article/details/60968728

         整整搞了一天,终于解决这个问题了。这里是四个module,module之间存在依赖,打包两个可执行jar,看下最终效果吧

        

          聚合maven+spring-boot的搭建很简单,和普通的聚合maven没有什么区别。聚合maven+spring-boot打包成可执行jar就不是那么容易了,主要是因为spring-boot的坑有点多啊。普通聚合maven打包我就不说了。就说说和spring-boot一起打包的那些比较大的坑吧。

         一、spring-boot-maven-plugin打包出来的jar是不可依赖的

         比如我有一个root工程,type为pom,下面两个spring-boot工程作为它的module,分别为moduleA和moduleB。假如moduleA依赖于moduleB。如果你在moduleB中使用了spring-boot-maven-plugin的默认配置build,或者在root中使用spring-boot-maven-plugin的默认配置build。很遗憾,你在clean package的时候会发现moduleA找不到moduleB中的类。原因就是默认打包出来的jar是不可依赖的。

         解决方案:

        1、调整你的代码,把spring-boot的东西从moduleB中移走。官方文档是这样说的,但是大部分人不会

              这么干吧。

        2、官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执

              行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比

              如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。

              那么我会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar

         官方文档位置:84.5 Use a Spring Boot application as a dependency

         总结:回到聚合maven上,如果你在root工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在root工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。

         二、jdk8一定要指明

         不指明的话在开发工具里运行没有一点问题,如果你没有用到java8的特性打包也没有问题。一旦你用到了java8的特性,而且使用spring-boot-maven-plugin作为builder,一定要指明jdk版本。不然你会收到类似不识别Lambda,请使用resource8这样的错误。

        


 
  1. <properties>
  2. <java.version>1.8 </java.version>
  3. <maven.compiler.source>1.8 </maven.compiler.source>
  4. <maven.compiler.target>1.8 </maven.compiler.target>
  5. </properties>
          三、BOOT-INF陷阱

          这个问题就很恶心了。这个时候你已经打包成功,你会发现运行jar的时候报错为file not found,而且不告诉你是什么文件。你打开jar去看,发现需要的lib,配置文件,class一样也不缺。

          其实这里要说一个概念,spring-boot在打包后,会把文件拷贝到BOOT-INF/Classes之下,这个时候你原来定义的扫描包路径将失效。而这个问题官方文档根本没讲,还是我没有看到。

          这个陷阱在你使用packages定义扫描路径的时候等着你。或者获取工程下文件的时候。对于获取文件的话,可以在原路径前加上classes,当然你要区分开发环境或生产环境的话,你可以使用profile或者conditional来解决。如果是扫描包路径就恶心了,因为你加上classes之后,不报file not found了。而是不报错,只是警告你找不到hibernate的某些xml。但是你很可能根本没有使用hibernate。

          目前我的解法是使用register方法代替packages方法,但是问题就是,如果你的类很多,那将是一件痛苦的事情。还好我这里只需要配置两个基于jersey的公共类。

          顺便吐槽一下官方文档在配置jersey的时候根本没有提到packages方法,自然也就把这个BOOT-INF陷阱给忽略了。官方关于jersey的配置章节为27.2 JAX-RS and Jersey

         

          最后、举个例子。

          假设工程结构如下

          parent

                 moduleA

                 moduleB

                 moduleC

          其中moduleB被moduleA依赖,A使用jersey,moduleA和moduleC需要打包为可执行jar

          那么我们有两种方式聚合

         方式一 在parent中指定spring-boot-maven-plugin

         parent的pom.xml中的builder

       


 
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot </groupId>
  5. <artifactId>spring-boot-maven-plugin </artifactId>
  6. <configuration>
  7. <source>1.8 </source>
  8. <target>1.8 </target>
  9. </configuration>
  10. <executions>
  11. <execution>
  12. <goals>
  13. <goal>repackage </goal>
  14. </goals>
  15. </execution>
  16. </executions>
  17. </plugin>
  18. </plugins>
  19. </build>
            moduleB的pom.xml中的builder

 
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot </groupId>
  5. <artifactId>spring-boot-maven-plugin </artifactId>
  6. <configuration>
  7. <classifier>exec </classifier>
  8. </configuration>
  9. </plugin>
  10. </plugins>
  11. </build>
            其余工程不需要builder

           

             方法二

             parent的pom.xml不提供builder

             moduleA和moduleC的pom.xml中的builder


 
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot </groupId>
  5. <artifactId>spring-boot-maven-plugin </artifactId>
  6. <configuration>
  7. <source>1.8 </source>
  8. <target>1.8 </target>
  9. </configuration>
  10. <executions>
  11. <execution>
  12. <goals>
  13. <goal>repackage </goal>
  14. </goals>
  15. </execution>
  16. </executions>
  17. </plugin>
  18. </plugins>
  19. </build>

              最后,两种方法都需要把jersey配置文件中的packages方法换成register方法

 
  1. public class JerseyConfig extends ResourceConfig{
  2. public JerseyConfig() {
  3. register(RequestContextFilter.class);
  4. //配置restful package.
  5. //packages("com.zs.vehicle.rpc");
  6. //packages("classes/com/zs/vehicle/rpc");
  7. register(Base.class);
  8. register(Route.class);
  9. }
  10. }



            

           


<think>嗯,用户问的是PageHelper-Spring-Boot-Starter-1.4.7.jar下载后只有3KB,可能有问题。首先,我需要回忆一下PageHelper的依赖结构。通常,Maven或Gradle的依赖会自动下载主jar和它的依赖项。但是用户手动下载的话,可能出问题。 根据引用[4],正确的依赖配置是version 1.4.7,用户用的这个版本。正常来说,这个starter的jar应该不会只有3KB。可能用户下载的是pom文件而不是真正的jar。因为Maven仓库里,有时候主文件是pom,实际代码在另一个模块,比如pagehelper-spring-boot-autoconfigure,如引用[5]提到的需要同时引入starter和autoconfigure。不过starter通常会把必要的依赖打包进去,所以可能用户下载的途径有问题。 另外,查看用户提供的引用,比如引用[5]提到需要两个jar包,但starter一般已经包含这些,可能版本问题导致。但用户提到的是下载后的jar大小异常,所以可能文件损坏,或者下载的是元数据文件而不是jar本身。比如,中央仓库里,可能用户点击的是某个链接,错误地下载了.pom而不是.jar文件,导致文件过小。需要检查文件的扩展名是否正确,或者通过Maven/Gradle自动下载来避免这个问题。 还有可能,网络问题导致下载不完整。用户应该检查文件哈希,对比官方发布的信息。另外,检查Maven中央仓库的页面,确认1.4.7版本的jar文件大小是否正常。如果正常是几十KB或更大,3KB明显不对。建议用户使用构建工具自动管理依赖,避免手动下载出错。</think>关于PageHelper-Spring-Boot-Starter-1.4.7.jar文件大小异常的问题,以下是可能原因及解决方案: ### 一、文件不完整的原因分析 1. **依赖传递异常** PageHelper的Spring Boot Starter本质上是一个聚合依赖项,其实际功能代码位于核心模块$pagehelper$和自动配置模块$pagehelper-spring-boot-autoconfigure$。若仅下载starter模块而未自动获取子依赖,会导致文件异常[^4][^5]。 2. **Maven仓库同步延迟** 中央仓库(Maven Central)可能出现同步延迟或镜像站点缓存问题,导致下载的JAR文件不完整。建议通过官方仓库页面验证文件哈希值: $$ \text{SHA1校验码} = \text{文件唯一性验证关键指标} $$ 3. **构建工具配置错误** 若使用非Maven/Gradle方式手动下载,可能误触发了仅下载元数据文件(.pom)而非二进制文件(.jar),此时文件大小通常为3-5KB[^2][^3]。 --- ### 二、解决方案 1. **通过Maven验证依赖树** 在项目中添加以下配置后执行`mvn dependency:tree`: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> </dependency> ``` 观察是否包含`pagehelper(5.x.x)`和`pagehelper-spring-boot-autoconfigure(1.4.x)`子模块[^4][^5]。 2. **手动验证文件完整性** 访问[Maven Central仓库](https://repo1.maven.org/maven2/com/github/pagehelper/pagehelper-spring-boot-starter/1.4.7/),确认以下关键文件: - **JAR文件**:`pagehelper-spring-boot-starter-1.4.7.jar`(正常大小约15KB) - **POM文件**:`pagehelper-spring-boot-starter-1.4.7.pom`(约3KB) 若下载错位需重新获取[^1][^2]。 --- ### 三、推荐实践 ```bash # 通过Gradle强制刷新依赖 ./gradlew clean build --refresh-dependencies # Maven清除本地缓存 mvn dependency:purge-local-repository ``` 建议优先使用构建工具管理依赖,避免手动下载导致版本冲突[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值