前言:
今天学习和总结了一下maven的相关知识点,发现一些比较基础的东西居然也会忘记,这里对于一些日常工作中可能会遇到的问题进行了一下汇总。
idea怎么创建maven多module的项目
首先了解上面是多module?
一句话概括就是:一个父模块作为版本控制多个子模块,子模块负责接入到父模块当中作为整个项目的过程。
多Module管理项目的几种方式:
- 按照单模块拆分为多个子模块,比如将MVC三层架构拆分为 xxx-service,xxx-dao,xxx-model,不过这种方式个人感觉比较二,目前以业务模块拆分比较多,迁移到微服务比如用springcloude或者dubbo 的时候非常好用。
- 按照业务模块拆分,这种模式使用的比较多,也比较多见。
创建一个多module项目(idea2019.3.3版本)
创建一个父pom项目:
- 打开idea,选择
create new project
网络异常,图片无法展示
|
- 选择maven项目,同时不选任何的预加载设置
网络异常,图片无法展示
|
- 父pom配置如下:
网络异常,图片无法展示
|
- 删除
src
目录
网络异常,图片无法展示
|
创建子模块,引入到父pom里面
- 同样右击项目工程,选择
new module
,然后选择maven
,这时候会出现父模块以及对应的子模块名称
网络异常,图片无法展示
|
- 此时在父模块里面发现引入了子模块的内容
网络异常,图片无法展示
|
子父模块的区别:
父pom.xml文件内容:
<groupId>org.zxd</groupId> <artifactId>taglib</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <modules> <module>taglib-core</module> </modules> 复制代码
分为两个部分,一个部分是父pom的声明,包含gourpId,artifactId,打包方式必须是pom,因为使用了聚合模型,同时在父pom里面指定版本号,子模块不填写version会默认使用父pom的version号
<modules> <module>taglib-core</module> </modules> 复制代码
上面表示当前引入的子模块内容
子pom.xml文件内容:
<!-- 引用自父pom --> <parent> <artifactId>taglib</artifactId> <groupId>org.zxd</groupId> <version>1.0.0</version> </parent> <!-- 打包方式为jar包 --> <packaging>jar</packaging> <modelVersion>4.0.0</modelVersion> <artifactId>taglib-core</artifactId> <version>1.0.0</version> 复制代码
子模块之间进行互相的依赖
在下面的pom中可以在任意的子模块引入对应的父模块依赖
注意由于<parent>
这个标签会递归继承,所以要注意子依赖不要和依赖引入不同版本的依赖,这样容易造成冲突
<dependency> <groupId>org.zxd</groupId> <artifactId>taglib-core</artifactId> <version>1.0.0</version> <!-- 这里需要注释掉编译的作用域 --> <!--<scope>compile</scope>--> </dependency> 复制代码
将上面的项目改造为spring-boot多模块项目:
改造父pom文件:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> 复制代码
parent指向springboot-started
子模块只需要引入父pom的内容
Spring boot maven plugin问题
在打包spring boot项目时,需要使用如下插件:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> 复制代码
如果在用maven构建多模块项目时,不要将此插件放到parent pom中,否则如果有sub module不是spring boot应用,在打包时就会出错。只将该插件添加到是spring boot项目的子模块。