maven的聚合和继承(三)

来源:互联网 发布:判断素数c语言 9是素数 编辑:程序博客网 时间:2024/06/04 19:23

一、聚合

当我们定义多个maven项目的时候,如果需要同时对这些项目进行打包编译,正常情况下会一一的进行打包编译操作,这样做会有些繁琐。这时我们会想,能不能只执行一次打包编译,就能对所有项目都有效?maven的聚合,就是为了解决这样的问题。

首先我们创建一个简单的maven项目xxx_parent,该项目是不作任何操作:



在Packageing中选择pom,意思是该项目是作为管理的项目。packaging中还有两个值:jar(打包成jar包)、war(打包成war包)



在pom.xml中使用modules标签对项目进行聚合操作,配置如下:(../表示相对路径)

<modules>  <module>../xxx_log</module>  <module>../xxx_service</module>  <module>../xxx_core</module>  </modules>


经过综上配置以后,右键xxx_parent的pom.xml,执行clean package命令后,就会对xxx_log、xxx_service、xxx_core三个项目同时进行打包操作了。


二、继承

我们在创建了maven项目后,发现pom.xml里有些依赖是一样的,这些pom.xml文件中存在着大量的重复。为了不在每个pom.xml中都重复配置相同的依赖,

我们让项目都继承一个根类,在根类里面配置依赖,这样不仅不需要对项目进行重复的依赖配置,而且能对依赖进行统一的管理。这就是maven中jar包依赖的继承。

跟上面聚合一样,我们要创建一个pom的项目(即packaging=pom)作为根类管理项目,在该项目的pom.xml文件里,我们把需要用到的jar依赖都拷贝进来。

子类项目要使用根类项目的依赖时使用parent标签实现继承(relativePath指的是相对路径,指向根类项目的pom.xml文件):

<parent><groupId>com.carlo</groupId>  <artifactId>xxx_parent</artifactId>  <version>0.0.1-SNAPSHOT</version>  <relativePath>../xxx_parent/pom.xml</relativePath></parent>


值得注意的是,我们在根类定义依赖的时候,不能直接使用:

<dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>  </dependencies>
因为在根类项目中使用这种方式去声明依赖的话,在所有子类中,都会直接继承这个依赖。然而,并不是每个子类都需要这个依赖。


所以这里我们在根类中使用一个叫依赖管理的标签<dependencyManagement>,来管理依赖,这种方式不会直接被子类项目所继承。

因为在根类项目中已经声明了依赖的版本号(version)和作用域(scope),所以当子类项目需要用到某个依赖时,

只需在自己项目的pom.xml中只需声明依赖的 groupId 和 artifactId ,就会从根类项目中继承获取到对应的依赖。
如果有使用<exclusions>标签排除依赖,在根类项目中声明了,子类项目就不需要再次声明了(如下面示例中的xx/yy.0.0.jar包,

因为在根类项目中已经定义了依赖解除,所以子类项目中就不需要再次声明了)。

【这里我们可以把 groupId 和 artifactId 理解为坐标,子类项目通过这两个值(坐标)去匹配获取到根类项目中声明的对应依赖】

根类pom.xml示例:

<pre name="code" class="html"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.carlo</groupId>  <artifactId>xxx_parent</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>pom</packaging>  <build/>    <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>      <dependencyManagement>  <dependencies>  <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>      <dependency>      <groupId>xx</groupId>      <artifactId>yyy</artifactId>      <version>0.0.1</version>      <exclusions>      <exclusion>      <groupId>aa</groupId>      <artifactId>bb</artifactId>      </exclusion>      </exclusions>    </dependency>  </dependencies>  </dependencyManagement>  </project>



子类pom.xml示例:

<pre name="code" class="html"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion><parent><groupId>com.carlo</groupId>  <artifactId>xxx_parent</artifactId>  <version>0.0.1-SNAPSHOT</version>  <relativePath>../xxx_parent/pom.xml</relativePath></parent>  <artifactId>xxx_log</artifactId>  <packaging>jar</packaging>  <name>xxx_log</name>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>    </dependency>        <dependency>      <groupId>xx</groupId>      <artifactId>yyy</artifactId>  </dependency>      </dependencies></project>



综上,就是聚合和继承的内容,我们发现,聚合和继承很类似,都是需要定义一个根类来作统一管理。

所以平时工作中,习惯把聚合和继承放到同一个pom管理项目中。

pom.xml示例:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.carlo</groupId>  <artifactId>xxx_parent</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>pom</packaging>  <build/>    <!-- 聚合 -->  <modules>  <module>../xxx_log</module>  <module>../xxx_service</module>  <module>../xxx_core</module>  </modules>    <!-- 继承 -->  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>  <dependencyManagement>  <dependencies>  <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>      <dependency>      <groupId>xx</groupId>      <artifactId>yyy</artifactId>      <version>0.0.1</version>      <exclusions>      <exclusion>      <groupId>aa</groupId>      <artifactId>bb</artifactId>      </exclusion>      </exclusions>    </dependency>  </dependencies>  </dependencyManagement>  </project>



0 0
原创粉丝点击