其实这么久我都没搭建Springboot多模块项目,公司项目只要加module就行,日常项目就一个独立单体工程。这次尝试搭建Springboot multi module聚合工程,顺便学习modules、dependencyManagement、dependency的用法,之前理解有些误区。
创建父工程
有一个点要注意,默认创建方式可能会因为网络原因报错Spring Initializr Error,碰到这种情况可以用我图片中地址自定义创建
http://start.springboot.io

因为父工程是一个特殊的Springboot项目,特殊在只要 pom.xml,并不用初始化其他文件,所以这里有两种方案,要么直接下一步,创建成功后,删除不需要的,或者像我一样,修改Type,只要pom.xml。

如果是单体项目,为了快速开发,这里可以选择依赖web,但我们这不用管,继续下一步

记得在本地多创建一层路径

因为这是父工程的pom.xml文件,其实这就是BOM。

添加如下代码,如果显示jar,将它修改成pom也行
<packaging>pom</packaging>
接下来使用创建子模块,创建方式和上面一样,除了这些子模块需要初始化Springboot默认文件,所以上面那步修改Type在这并不用管。
创建三个子模块:jh-core、jh-web、jh-admin。

记得将子模块中dependencies删干净。
OK,现在来改造父工程pom.xml,使用<modules>引入子模块
<modules>
<module>jh-core</module>
<module>jh-web</module>
<module>jh-admin</module>
</modules>
它的好处是一键打包。
每个子模块都能生成jar,要么被其他子模块依赖使用,要么放到服务器上运行。假设现在子模块jh-core被jh-web和jh-admin依赖。那如果我们想打包jh-admin,那得先打包jh-core,生成jar后再打包jh-admin。必须有这个顺序,因为后者使用了前者。
但使用modules,可以在父工程一键打包,Maven 会分享我们的子模块和项目,按照子模块之间依赖关系,自动打包,我们就不用关心顺序。

我这举例就三个子模块,依赖关系简单,看起来作用不大,但如果子模块丰富,相互依赖复杂,这就很重要了。
还有个事,如果不配置
modules引入子模块,就算子模块配置parent,也无法使用父工程中公共依赖
接着在每个子模块中依赖父工程
<parent>
<groupId>com.guozh</groupId>
<artifactId>juhe</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
然后是dependencyManagement和dependencies的使用,父工程里的依赖要慎重,只依赖最常用、最公共的jar。
因为子工程使用parent会将父工程所有依赖都继承。但项目中可能存在一些工具性质的子模块,它并不需要继承那么多依赖,所以父工程中公共依赖要慎重。将大部分公共、常用依赖放到core模块中,其他子模块需要用到,依赖core就行了。
这是一种解决方案,还有就是用dependencyManagement,它的作用是声明依赖,只声明并不依赖。
比如我在里面声明一个依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
</dependencies>
</dependencyManagement>
但其实父工程并没真正依赖这个jar,可以在右侧maven中查看,肯定找不到这个依赖。父工程里都没,那子模块肯定也继承不到。所以,这样就不用担心,子模块只是依赖父工程,就将所有依赖就下载。那子模块想用这个依赖怎么办呢?在子模块中依赖需要的。
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
可以看到上面依赖我忽略了版本号,其实这就是dependencyManagement的作用,这里子模块中会使用父工程中声明依赖的版本号。如果其他子模块也使用了这个依赖,也会顺着找到父工程的这个依赖版本号,这样实现统一管理依赖的版本号。
发现没?作用真不大,甚至很鸡肋。
如果想统一管理版本号,那为啥不使用properties呢?
如果只声明并不真正依赖,将公共依赖声明到里面,这样子模块就不会依赖所有的jar包,那干嘛不创建一个类似core性质的公共核心子模块呢?
反正我不喜欢用。
以上就是Springboot搭建多模块项目内容。
本文由老郭种树原创,转载请注明:https://guozh.net/springboot-maven-multi-module/
我在公司实习那会,公司的项目就是使用这种方式做的。