1.maven项目的继承
1. 为什么要进行maven项目继承?
在java中如果有多个class有多个相同的属性或者方法时,我们就会将这些属性或方法抽取出来,创建一个“baseEntity”,然后让各个类去继承“baseEntity”,这样方便我们对这些属性进行统一的维护和管理。
同样的,当我们有多个maven项目时就意味着我们有多个pom.xml,可能在这些pom.xml中也会有多个相同的依赖,这时很可能就会产生不同maven项目中相同依赖的版本不一致或者一些其他的问题。
那么要怎么解决呢?能不能像java中一样将一些公共的依赖抽取到一个maven项目中,进行统一管理呢?
答案是当然可以了,maven为我们提供了一个“父工程”的管理模式。
2.如何进行maven项目继承?
2.1. 创建父maven工程,创建方式和之前的maven工程是一样的,父工程和其他普通的“java”或者“web”工程的区别就是打包的方式是“pom”;
tip:需要注意的是创建父工程时我们的“Group Id”和“Version”需要和子工程保持一致,因为通常我们是现有子工程后有父工程的,保持一致就免得我们后期去调整了
2.2. 在子工程的pom中引用父工程,使用的属性是
<!-- 声明父工程 -->
<parent>
<groupId>com.qianghao.maven</groupId>
<artifactId>masterMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前pom为基础的父工程pom的相对路径,为了子工程更准确的找到父工程 -->
<relativePath>../masterMaven/pom.xml</relativePath>
</parent>
tip:当我们将父工程引用进来后我们会发现之前我们子工程的坐标声明报了警告“GroupId is duplicate of parent groupId”,意思是“GroupId与父GroupId重复”,因为我们子工程的(groupId)组织id和迭代版本(version)一定是一致的,所以在引用了父工程后将在子工程中再次声明就有点多此一举,直接将其删除就可以了
2.3. 在父工程中统一管理依赖,使用属性,以Junit为例;
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
当我们在父工程中配置好了之后,子工程中的Junit依赖的版本声明就会报警,将其删除即可(如果确实这个项目就是需要和父工程不一样,则可以继续声明);
配置完成后当我们修改父工程的版本时,子工程的依赖就也随之改变了
声明方式:
<properties>
<你定义的名字>3.8.2</你定义的名字>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${你定义的名字}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.结合maven的父工程简单介绍properties属性
properties属性允许我们在pom中声明一些自定义标签,用来管理一些属性值,它的作用就相当于是java在class中声明了一些全局变量,以便在需要的时候引用;
例如我们可以将Junit的版本号进行声明,
3.maven项目的聚合
当我们使用了继承后,想要将项目安装到本地仓库时,需要先将父工程install,然后再逐个执行子工程的install,这样的话就显得有点麻烦了,聚合就是为了解决这个问题的,我们可以在master中使用modules标签配置聚合(当然也可以在其他工程中配置,但是一般在master中),配置时我们不用理会各个项目间的依赖关系,maven会自动识别依赖关系进行先后装载的;
<modules>
<module>mavenTest01</module>
<module>mavenTest02</module>
<module>mavenTest03</module>
</modules>
配置完成后在master上执行install就会自动将聚合的项目安装到maven本地仓库中了