基于SpringBoot的多模块(Multi-Modules)Maven项目建立、运行和打包

一、多模块项目建立

父工程管理着项目中所有通用的maven依赖,子模块继承父工程(模块)后,可以减少子模块pom文件中依赖的重复添加,也便于统一依赖的版本。

1.1 父工程或父模块

方式1:根项目即为父工程

使用IntelliJ IDEA新建SpringBoot项目,删除其中的src,保留pom文件。然后在此项目基础上new module。
这种项目目录下,项目根路径处会有一个pom文件。

方式2:根项目为空工程,建立父模块

使用IntelliJ IDEA新建Empty Project,并在其中新建一个父module,删除其中的src,保留pom文件。
这种项目目录下,根路径下没有配置文件。本文采用的是方式二。
假设公司名为alibaba,项目名为taobao,那么父工程中应该有如下标签:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.alibaba.taobao</groupId>
<artifactId>taobao-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>taobao-parent</name>
<description>父模块,管理所有通用jar包</description>

其中,parent标签中的内容表示该父模块继承了spring-boot-starter-parent。groupId应该为公司下具体的项目名,artifactId为模块名。
扩展:
《maven中GroupID 和ArtifactID怎么写》https://blog.csdn.net/yxwb1253587469/article/details/61912973

1.2 在父pom中添加子模块

在父模块中管理子模块,如果父子模块为平级目录,接着应在父模块的pom文件中添加如下标签(模块名自定义):

<modules>
    <module>../taobao-model</module>
    <module>../taobao-dao</module>
    <module>../taobao-biz</module>
    <module>../taobao-web</module>
</modules>

其中,modules需要按照依赖的从底层到顶层的顺序排列,如dao依赖model,biz依赖dao和model,web依赖biz和model,所以依赖关系的由下而上关系为:model - dao - biz - web。

1.3 子模块继承父pom

在子模块中应添加如下标签:

<parent>
    <groupId>com.alibaba.taobao</groupId>
    <artifactId>taobao-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../taobao-parent/pom.xml</relativePath>
</parent>
<artifactId>taobao-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>taobao-dao</name>
<description>dao层模块</description>

其中,parent标签中的内容表示该父模块继承了taobao-parent,也就间接继承了spring-boot-starter-parent和父模块中的其他依赖。

1.4 子模块相互依赖

根据1.2中的分析,应该在dao模块中加入model的依赖,biz加入dao依赖,web加入biz依赖。例:在biz中加入dao和model模块的依赖:
taobao-biz的pom.xml

<dependency>
    <groupId>com.alibaba.taobao</groupId>
    <artifactId>taobao-dao</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.alibaba.taobao</groupId>
    <artifactId>taobao-model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

二、多模块项目运行

子模块的代码编写完成,需要进行模块间单元测试,此时假设我们在biz中注入dao的@Repository类进行单元测试。但却会报类似错误:

XxxDao could not be autowired, no candidate beans found.

原因及解决方法
假设:
taobao-model的根包名被定义为com.alibaba.taobao.model,启动类为ModelApplication;
taobao-dao的根包名被定义为com.alibaba.taobao.dao,启动类为DaoApplication;
taobao-biz的根包名被定义为com.alibaba.taobao.service,启动类为BizApplication;
taobao-web的根包名被定义为com.alibaba.taobao.controller,启动类为WebApplication;
以DaoApplication和BizApplication的关系为例,BizApplication的@SpringBootApplication注解是无法扫描到DaoApplication所在的包com.alibaba.taobao.dao下的steretype组件(@Repository标记类)的。
因为@SpringBootApplication默认扫描当前包及子包下的所有组件。为了让BizApplication扫描到com.alibaba.taobao.dao下的组件,那么应该扩大扫描范围:

扫描二维码关注公众号,回复: 8702060 查看本文章
@SpringBootApplication(scanBasePackages = {"com.alibaba.taobao"})

详见我的博客:
《基于SpringBoot的多模块项目引入其他模块时@Autowired无法注入其他模块stereotype注解类对象的问题解决》https://blog.csdn.net/qq_15329947/article/details/89149847

三、多模块项目打包

3.1 一键安装

model、dao、biz这三个项目需要install普通jar包,而不是springboot的可执行jar包,所以将这三个项目的build标签全部去掉,就会install出普通jar包。
由于在项目建立时父模块的modules标签对子模块的自底向上管理和dependencies标签的通用依赖一键式管理,以及子模块对彼此依赖关系的添加,所以项目结构和依赖关系非常清晰。此时可以直接在父模块中一键install,各个子模块就会遵守maven的依赖关系,按照正确的顺序将各个项目install进本地仓库。install顺序为model - dao - biz - web。
其中web相关的项目提供了基于HTTP等协议的接口,是可以直接上线被前端所访问的。

3.2 关于本地jar包

建议不要使用system scope dependency,因为本地依赖可能需要在多个项目中添加本地依赖jar包,甚至可能无法完成子模块对父模块的本地依赖继承。此时,可以使用mvn install命令,将所有本地依赖jar包(maven仓库中找不到的jar包)安装进本地仓库,然后使用常规dependency添加。具体参考我的博客:
《手动安装本地jar包至Maven仓库》https://blog.csdn.net/qq_15329947/article/details/86350080

发布了79 篇原创文章 · 获赞 322 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_15329947/article/details/89306970
今日推荐