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

3 篇文章 0 订阅
1 篇文章 0 订阅

一、多模块项目建立

父工程管理着项目中所有通用的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下的组件,那么应该扩大扫描范围:

@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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值