此文已由作者易国强授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

明确功能,各司其职

  • 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践。有人会说可以在同一个Project中定义不同的包名及包路径来做区分,但这样当功能复杂后并不可取。

  • 当然,如果你的项目足够简单,比如只是提供一个很简单的微服务,没有分层治理的概念,那么则不需要关心这个问题了。

  • 下面就Spring Boot环境中多module打包的注意事项列举如下,希望对大家有所帮助。


  • 新建所需要的module模块,在此示例中新建两个module,bingo-core和bingo-web。其中bingo-core作为封装服务提供给bingo-web使用,bingo-web作为我们的工程的最终jar包提供服务。为了说明问题,我们仍然采用spring boot框架来构建这两个module。

  • 具体新建步骤可参考《从0到1,只需两分钟》这篇文章,不同的是,在新建的时候选择新建module即可。新建完毕后,工程结构如下图所示。注意此时父pom文件的打包方式需要变更成pom,不再是jar或者war。

  • 通过在bingo-core中新建一个类,然后在bingo-web中使用此类以说明问题。(示例类在此省略,大家可以自己试试)

  • 这个时候如果我们不做任何修改,直接package就会出现问题,提示找不到bingo-core中的相关类。如下图所示:

  • 那么问题就是这里了,这个问题和spring boot的打包方式有关系,spring boot默认将每个module打包成一个fat jar,这个jar包和我们正常使用的jar包内部的结构是不相同的,如下图所示,fat jar包含了直接运行所需要的所有信息(包含内嵌的容器,如果是一个web应用的话),那么类的加载路径此时就发生了变化,所以在编译时会提示找不到引用类。

  • 这个时候我们只需要通过配置maven的插件参数来使相关需要使用的jar打包成正常的jar包即可。修改配置如下:

    • 在需要变更打包方式的pom.xml文件中(如在bingo-core模块),修改插件配置如下所示:

      <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins></build>
    • 另外需要注意的是,需要在bingo-core/bingo-web模块的测试类中加入@SpringBootTest注解的作用范围,如下图所示:

![image](https://github.com/siyuyifang/image/blob/master/spring-boot/4/4-3.png?raw=true)- 此时再执行maven的package命令即可发现打包成功。我们查看bingo-core打包生成的jar包可以发现,实际上会有两个,如下图所示,带-exec后缀的就是我们默认的fat jar。可以直接运行的jar包。

![image](https://github.com/siyuyifang/image/blob/master/spring-boot/4/4-4.png?raw=true)
  • 多module的打包方式修改比较简单,但当出现这个问题时,如果不清楚其原因,还是比较折腾人的。

  • 不足之处,欢迎指正,谢谢~

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 如何解决在线网页挂载本地样式的问题

Spring Boot 学习系列(04)—分而治之,多module打包的更多相关文章

  1. Spring Boot 学习系列(10)—SpringBoot+JSP的使

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...

  2. Spring Boot 学习系列(03)—jar or war,做出你的选择

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...

  3. Spring Boot 学习系列(序)—Spring Boot

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...

  4. Spring Boot 学习系列(06)—采用log4j2记录日志

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...

  5. Spring Boot 学习系列(05)—自定义视图解析规则

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...

  6. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  7. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  8. Spring Boot 学习系列(07)—properties文件读取

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...

  9. Spring Boot 学习系列(01)—从0到1,只需两分钟

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...

随机推荐

  1. Flatify分页

    Flatify分页:<ul uib-pagination total-items="siteCount" items-per-page="1" max-s ...

  2. Tika解析word文件

    Apache POI - HWPF and XWPF - Java API to Handle Microsoft Word Files http://poi.apache.org/document/ ...

  3. 多媒体开发之--- Live555 server 获取不到本地ip 全为0

    今天把wis-streamer live555 移植到8148上面跑起来了,运行testOnDemandRTSPServer的时候发现,本地IP地址居然为0.0.0.0; 于是乎就跟踪调试了下,看看它 ...

  4. 【BZOJ4293】[PA2015]Siano 线段树

    [BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会 ...

  5. Netty 100万级高并发服务器配置

    前言 每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼. 这次使用经常使用的顺手的netty NIO框架(n ...

  6. 为编译器的实现者提供一个精确的定义:ANSI C

    编译器的实现 常用C++编译器推荐_w3cschool https://www.w3cschool.cn/cpp/cpp-zxm72ps8.html 常用C++编译器推荐 由 Alma 创建, 最后一 ...

  7. PAT天梯赛 L2-026. 小字辈 【BFS】

    题目链接 https://www.patest.cn/contests/gplt/L2-026 思路 用一个二维vector 来保存 每个人的子女 然后用BFS 广搜下去,当目前的状态 是搜完的时候 ...

  8. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

  9. extjs grid renderer参数用法

    今天在导出EXT的二维时老是报错,追进去看是renderer : function(value)的参数不对,经过一番研究,未免以后遇到再次浪费时间,记录一下. var cm = new Ext.gri ...

  10. led子系统【转】

    本文转载自:http://blog.csdn.net/yuanlulu/article/details/6438841 版权声明:本文为博主原创文章,未经博主允许不得转载. ============= ...