Maven中的聚合与继承

1、聚合

  一个带有模块的项目称为“多模块”或“聚合器”项目。模块是POM列出的项目,并作为一个组执行。一个pom打包的项目可以通过将它们作为模块来聚合一组项目的构建,这些模块是这些项目的目录或pom文件的相对路径。

<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
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-parent</artifactId>
  <version>2.0</version>
  <packaging>pom</packaging>

  <modules>
    <module>my-project</module>
    <module>another-project</module>
    <module>third-project/pom-example.xml</module>
  </modules>
</project>

  在列出模块时,您不需要考虑模块间的依赖关系,也就是说,POM给出的模块的顺序并不重要。Maven将在拓扑上对模块进行排序,这样依赖项总是在依赖模块之前构建。

  继承和聚合创建了一个良好的动态,通过一个单一的高级POM来控制构建。你经常会看到既有继承又有聚合的项目。例如,整个maven核心都是通过一个基本的POM org.apache.maven:maven来运行的。因此构建maven项目可以由单个命令执行:mvn compile。然而,尽管就整个POM项目而言,一个聚合项目和一个继承项目是不一样的,不应该被混淆。一个POM项目可能来自于继承但不是必须的——它还可能是其它任何类型的聚合模块。相反,一个POM项目可能只涉及到聚合而不涉及到继承。

  下面我们举例来说明,之前的文章中,我们已经成功的创建了两个Maven项目,一个是my-app,另一个是maven-parent,这两个项目都是采用的继承的模式,现在我们可以用聚合的方式将其组合成一体,比如说将maven-parent聚合到my-app中,具体的做法是修改my-app中的父类pom.xml即可。

  my-app中的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>myapp1</module>
    <module>myapp2</module>
    <module>myapp3</module>
    <module>myapp4</module>
    <module>myapp5</module>
    <module>myapp6</module>
    <module>my-app-site</module>
    <module>my-webapp</module>
    <module>maven-parent</module>
  </modules>
  <name>my-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

  通过这样的变化,它们就成功的聚合到了一起,通过在my-app中的pom.xml执行相应的构建,其所聚合的项目maven-parent也会被一起构建。

  详细的代码可以参考下面的链接:

2、继承

  在之前的文章中,我就已经多少谈到了Maven的继承,在这里我重点谈一下Maven的继承原则,在Maven中一共有两大继承原则。

其一是:短路优先原则

  我们假设有项目D,项目E,项目F三个项目,在项目D,和项目E中都存在一个类Say,它们的源码如下:

  项目D中的类Say:

package com.lyc;

public class Say {

    public String say(){
        return "D";
    }
}

  项目E中的类Say:

package com.lyc;

public class Say {

    public String say(){
        return "E";
    }
}

  在项目E中存在测试类SayTest,在项目F中也存在测试类SayTest,它们的源码都相同,都如下:

  项目E、F中的类SayTest

package com.lyc;

import org.junit.Test;

public class SayTest {

    @Test
    public void test(){
        Say say = new Say();
        System.out.println(say.say());
    }

}

  由于我们知道,Maven允许继承,在这种情况下,F依赖了E,E又依赖了D,这样在运行F中的SayTest类时,我们根据最短路径原则不难知道,在F中运行的是输出项目E中的Say类,此时我们输出为E。

  当我们在运行项目E中的SayTest类时,其输出的也是E,这也同样不违反该定律,因为毕竟调用自身的Say,类要比调用依赖的Say类依赖路径更短。

  详细的源代码如下:

其二是:谁先声明,先解析谁

  这个比较好理解,就是我们假设现在有三个项目,分别为项目H、项目I、项目J三个项目,现在在项目H,和项目I中都存在类Say,然后在项目J中存在测试类SayTest,下面是项目J中的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">
    <parent>
        <artifactId>maven-parent3</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>J</artifactId>
    <packaging>jar</packaging>

    <name>J</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.lyc</groupId>
            <artifactId>H</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lyc</groupId>
            <artifactId>I</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

  在项目J中运行测试类SayTest,根据谁先声明,先解析谁的原理,由于项目H在项目J中优先声明,因而在项目J中调用SayTest时输出的内容为“H”。

  项目的详细源码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值