如何使用 IDEA 构建父/子工程类型的Maven项目
Maven的继承性
在一家公司里开发,很多项目中使用的jar包80%都是重复的,如果每个项目都要把pom.xml文件的这些依赖包复制过来,或是后期出现统一的版本升级,那修改起来是很麻烦的。
这里可以使用maven的继承特性来消除重复依赖,可以把很多相同的配置提取出来。例如:grouptId,version等
一、创建父工程
- 父工程的打包类型必须是POM
1、打开IDEA,选择New Project
2、选择Maven选项,构建一个maven项目
- 左侧选择Maven,勾选右侧Create from archetype选项,选择下面区域中的 maven-archetype-site-simple 类型
注意:这类项目和原来项目的区别在于,打包方式是pom
<groupId>com.kkb</groupId>
<artifactId>father</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
3、创建项目名称,选择项目路径
可自定义GroupId,ArtifactId的值
4、在 Maven home directory 中选择自己下载的Maven
有时我们会发现 IDEA 在每次新建项目时 maven home directory 总是会变回默认的Maven。我们可以修改Maven仓库全局配置解决。
参考地址:https://blog.csdn.net/LK_Lawliet/article/details/108444328
由于pom项目一般都是用来做父项目的,所以该项目的src文件夹可以删除掉。
5、父工程创建完毕
⚠ 存在问题:
在创建完父工程后,pom.xml文件中的 maven-project-info-reports-plugin 插件会飘红
原因:maven-project-info-reports-plugin 缺少依赖,我们可以在pom.xml中添加父依赖
解决如下:
二、创建子工程
创建方式有两种:
-
一种是创建新工程为子工程,在创建时设置父工程的GAV
-
一种是修改原有的工程为子工程,在子工程的pom.xml文件中手动添加父工程的GAV
1、右击项目,选择 New -> Module
选择要创建的子项目类型(默认为Java类型)
此时只需要添加子项目名称即可,然后一直下一步
2、子工程创建完毕
三、父工程统一管理版本号
在开发中依赖的jar包众多,对应的版本也是很杂乱,那有没有一种方式可以统一管理这么jar包的版本值呢?当然 是有的,Maven使用dependencyManagement来管理依赖的版本号。
注意:此处只是定义依赖jar包的版本号,并不实际依赖。如果子工程中需要依赖jar包还需要添加dependency节点。
< dependencies > 中的jar直接加到项目中,管理的是依赖关系(如果有父pom,子pom,则子pom中只能被动接受父类的版本);
< dependencyManagement > 主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom不一定要继承父pom所定义的版本。
父工程:声明版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.kkb</groupId>
<artifactId>demo2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程:不需要指定版本号(继承父元素)
<parent>
<groupId>com.kkb</groupId>
<artifactId>father</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.kkb</groupId>
<artifactId>demo2</artifactId> <!--这里不需要指定版本-->
</dependency>
</dependencies>
父工程中版本号提取
当父工程中定义的jar包越来越多,找起来越来越麻烦,所以可以把版本号提取成一个属性集中管理。
<properties>
<log4j.version>1.2.9</log4j.version>
</properties>
注意:这里的log4j.version的值是自定义的,但命名时不要使用中文或特殊字符等,标签对中间写版本值
使用:${log4j.version}读取该变量值,代码如下
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${log4j.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
子工程的jar包版本不受影响