专栏首页晨曦破晓の家记一次线上问题排查-maven父子结构依赖所遇到的坑

记一次线上问题排查-maven父子结构依赖所遇到的坑

场景:

基于springboot框架所搭建的maven工程,而且都是相互独立的。有个parent父工程,common基础模块、以及其他模块(Module A、Module B)等。

问题:

有个RabbitMQ producer生产者模块需要作为jar包被其他工程引入比如Module A。在对Module A进行打包时,出现问题:Module A中所依赖的producer工程的util程序包不存在。即使能打包成功,用java -jar启动jar包也会报Class Not Found,依赖的producer工程的类找不到。

解决方案:

未解决之前在producer工程的pom.xml中maven插件的配置如下:

<build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                   
                </plugin>
             
            </plugins>
        </build>

解决之后producer工程的pom.xml中maven插件的配置如下:

<build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </plugin>
             
            </plugins>
        </build>

第二种解决方案:

注释如下代码就能直接打包可依赖的jar包
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                   
                </plugin>
             
            </plugins>

原因分析:

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

我们现在整合后的maven项目有一个parent工程,打包类型为pom,下面多个spring-boot工程作为它的module,分别为producer和moduleA,moduleB。假如moduleA依赖于producer。如果你在producer中使用了spring-boot-maven-plugin的默认配置build,或者在parent工程中使用spring-boot-maven-plugin的默认配置build。那么在clean package的时候会发现moduleA找不到base中的类。原因就是默认打包出来的jar是不可依赖的。

解决方案:

官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个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上,如果你在parent工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在parent工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 8个尽量优化你的SQL

    ==3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。==

    用户4464623
  • Windows下Scoop安装、配置与使用

    Scoop是Windows的命令行安装程序,是一个强大的包管理工具。可以在github上找到其项目的相关信息,项目网址。

    用户4464623
  • Yapi 可视化接口平台安装实践

    使用我们提供的 yapi-cli 工具,部署 YApi 平台是非常容易的。执行 yapi server 启动可视化部署程序,输入相应的配置和点击开始部署,就能完...

    用户4464623
  • 企业都在用的 spring boot 打包插件,真的超好用!

    在平时的项目中,我们用到了 spring boot 默认的插件 spring-boot-maven-plugin 来进行打包,打的包是直接可执行的。但是这次,有...

    create17
  • 没人看系列----css 随笔

    kmonkey
  • 可视化工具gephi源码探秘(二)---导入netbeans

      在上篇《可视化工具gephi源码探秘(一)》中主要介绍了如何将gephi的源码导入myeclipse中遇到的一些问题,此篇接着上篇而来,主要讲解当下通过my...

    JackieZheng
  • Spring Boot启动方式与部署

    Spring Boot为我们提供很多便捷的启动和配置方式。本文就来好好说一下这两方面。

    迹_Jason
  • 【CSS】776- 16个非常有用的CSS伪选择器

    (伪)选择器可以为文档中不一定具体存在的结构指定样式,或者为某些元素、文档的标记模式、甚至是文档本身的状态所指示的幻像类指定样式。— CSS 权威指南:Eric...

    pingan8787
  • CSS基础知识

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    奋飛
  • 浅谈国外航空发动机大数据应用

    大数据是信息化发展的新阶段。飞机上传感器数量最多的部位就是发动机。一个现代航空发动机,每10毫秒就能生成几百个传感器信息,每次飞行能产生1TB数据。随着传感器技...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券