Spring Boot 学习系列(04)—分而治之,多module打包
此文已由作者易国强授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
明确功能,各司其职
在一个结构清晰的项目中,一个没有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注解的作用范围,如下图所示:
- 此时再执行maven的package命令即可发现打包成功。我们查看bingo-core打包生成的jar包可以发现,实际上会有两个,如下图所示,带-exec后缀的就是我们默认的fat jar。可以直接运行的jar包。 
多module的打包方式修改比较简单,但当出现这个问题时,如果不清楚其原因,还是比较折腾人的。
不足之处,欢迎指正,谢谢~
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 如何解决在线网页挂载本地样式的问题
Spring Boot 学习系列(04)—分而治之,多module打包的更多相关文章
- Spring Boot 学习系列(10)—SpringBoot+JSP的使
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...
- Spring Boot 学习系列(03)—jar or war,做出你的选择
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...
- Spring Boot 学习系列(序)—Spring Boot
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...
- Spring Boot 学习系列(06)—采用log4j2记录日志
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...
- Spring Boot 学习系列(05)—自定义视图解析规则
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...
- Spring Boot 学习系列(09)—自定义Bean的顺序加载
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...
- Spring Boot 学习系列(08)—自定义servlet、filter及listener
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...
- Spring Boot 学习系列(07)—properties文件读取
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的properties读取方式 一般的,我们都可以自定义一个xxx.properties文件,然后在工程 ...
- Spring Boot 学习系列(01)—从0到1,只需两分钟
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 快速构建 如果我们想基于spring mvc 提供一个简单的API查询服务,传统的方式,首先需要我们引入sp ...
随机推荐
- Dos下mySql
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ...
- h5页面测试
转自:http://www.blogjava.net/qileilove/archive/2014/07/24/416154.html?utm_source=tuicool&utm_mediu ...
- 数据挖掘项目之---通过对web日志的挖掘来实现内容推荐系统
先说一说问题,不知道大家有没有这样的经验,反正我是经常碰到. 举例1,某些网站每隔几天就发邮件给我,每次发的邮件内容都是一些我根本不感兴趣的东西,我不甚其扰,对其深恶痛绝. 举例2,添 ...
- RTSPClient工具EasyRTSPClient支持H.265,支持海思等各种芯片平台
EasyRTSPClient是EasyDarwin开源流媒体团队开发.提供的一套非常稳定.易用.支持重连的RTSPClient工具,接口调用非常简单,再也不用像调用live555那样处理整个RTSP ...
- Easyui datagrid 怎么添加操作按钮,rowStyler
说明:本篇文章主要是展示怎么设置easyUI datagrid的格式,包括行样式和列样式,以及添加操作按钮列 开发环境 vs2012 asp.net mvc4 c# 1.效果图 3.HTML代码 & ...
- unity导出android项目
1. 2 . 3 选择Google Android Project(若不选则直接导出Apk) Export,Android项目即可导出成功.
- Mac端博客发布工具推荐
引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...
- PAT 天梯赛 L3-010. 是否完全二叉搜索树 【Tree】
题目链接 https://www.patest.cn/contests/gplt/L3-010 思路 因为是 完全二叉搜索树 可以用 数据 建树的方式 然后 遍历一遍这个 数字 就是 层序遍历 遍历的 ...
- @SuppressWarnings("serial")注解
@SuppressWarnings J2SE 提供的一个批注或者注解.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默,即忽略这些警告信息. 在平常的编码过程中,我们经常 ...
- 安装python解释器
Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Python环境,在Windows系统上需要安装一下,超简单 打开官网 https://www.python.org/d ...