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

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

明确功能,各司其职

  • 在一个结构清晰的项目中,一个没有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的打包方式修改比较简单,但当出现这个问题时,如果不清楚其原因,还是比较折腾人的。

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

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

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

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

最新文章

  1. 模块化编程时,#include到底要放在哪里?
  2. iOS开发——高级篇——内存分析,Instruments
  3. iOS设备类型
  4. FZU 1914 Funny Positive Sequence
  5. 前端面试库_JS部分_02
  6. asp.net发布webservice出现‘Could not write to output file ‘解决办法
  7. JSP页面用EL表达式 输出date格式
  8. android webview js交互 第一节 (java和js交互)
  9. windows下Qt Creator5.1.0编写程序以及调用OpenCV库
  10. 浏览器标题栏添加小logo图片,记录一下,方便以后用
  11. Entity Framework技巧系列之十三 - Tip 51 - 55
  12. Oracle行转列的3种方法
  13. Vue学习之路---No.7(分享心得,欢迎批评指正)
  14. 微信小程序超出两行省略号
  15. IT痴汉的工作现状42-Android越用越慢?立场不同,谈何信任!
  16. Spring第三天——AOP注解实现与事务管理
  17. Git为某个域名设置代理
  18. eclipse--&gt;run as --&gt; maven test 中文乱码
  19. python:小乌龟turtle
  20. Python实践练习:生成随机的测验试卷文件

热门文章

  1. python中if __name__ == &#39;__main__&#39;: 的解析(转载)
  2. IO复用之select实现
  3. Lua_第17 章 数学库
  4. Vue 单页面应用 SEO SPA single page application advantages and disadvantages
  5. Hadoop实战-Flume之Hdfs Sink(十)
  6. Java 8新特性之旅:使用Stream API处理集合
  7. 使用ffmpeg添加logo
  8. HihoCoder 1488 : 排队接水(莫队+树状数组)
  9. BZOJ_3489_ A simple rmq problem_KDTree
  10. Java笔记(六)