其实这么久我都没搭建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/
我在公司实习那会,公司的项目就是使用这种方式做的。