在Maven中的继承与依赖传递

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZZY1078689276/article/details/78965771

1、Maven中的继承

  在Maven中,子项目是可以继承父项目中的依赖的,比如说我们有一个父项目maven-parent,该父项目拥有一个子项目A,如果在父项目中依赖了junit,那么在子项目A中即便是没有引入junit,在子项目中仍然能够使用junit,因为子项目天然继承了父项目中的junit依赖。

  为了更好的解释说明,下面是我贴上的详细代码:

  父项目:maven-parent中的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.lyc</groupId>
  <artifactId>maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>A</module>
  </modules>
  <packaging>pom</packaging>

  <name>maven-parent</name>
  <url>http://maven.apache.org</url>

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

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

  子项目A中的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-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>A</artifactId>
    <packaging>jar</packaging>

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

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

    <dependencies>

    </dependencies>
</project>

  通过上述代码,我们可以看到父项目中引入了junit依赖,而子项目中并没有引入,但是当我们查看子项目的依赖结构图时,我们却清楚的查看到了子项目A中含有junit依赖,这说明子项目是从父项目中继承了junit依赖,如下图所示:

这里写图片描述

2、Maven中的依赖传递

  在Maven中,依赖是可以传递的,就是说假设存在三个项目,分别是项目A,项目B以及项目C,假设C依赖于B,B依赖于A,那么我们可以根据Maven项目依赖的特征不难推出项目C也依赖于A。

  为了更好的解释说明,下面是我贴上的详细代码:

  项目A中的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-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>A</artifactId>
    <packaging>jar</packaging>

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

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

    <dependencies>

    </dependencies>
</project>

  项目B中的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-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>B</artifactId>
    <packaging>jar</packaging>

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

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

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

  项目C中的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-parent</artifactId>
        <groupId>com.lyc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>C</artifactId>
    <packaging>jar</packaging>

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

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

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

  通过上述代码,我们可以得出,项目B依赖于项目A,通过查看项目B的依赖结构图,我们也可以查看到相应的结果。

这里写图片描述

  项目C依赖于项目B,而项目B又依赖于项目A,于是我们不难推出,项目C也就依赖于项目A,从项目C的依赖结构图中我们也可以查看到相同的结果。

这里写图片描述

  从Java代码的调用上也可以说明这一点。

  假如说我们在项目A中写上如下代码:

package com.lyc;

public class Say {

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

  在项目A的测试代码部分,我们写下如下代码:

package com.lyc;

import org.junit.Test;

public class SayTest {

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

}

  当我们运行项目A中的SayTest中的方法时,控制台中打印的就是项目A中的类Say中的方法say(),此时在控制台中输出的信息是“A”。

  然后我们将SayTest分别复制到项目B,与项目C中。我们知道,项目B与项目C中并没有引入Say类,假如说我们执行项目B与项目C中的SayTest类,而这些结果都同时输出“A”,则进一步验证了项目B与项目C共同依赖了项目A,这也就进一步验证了依赖是可以传递的。

  在项目B,中输出的结果:“A”
  在项目C,中输出的结果:“A”

  这说明我们上面的判断是正确的。

  下面是项目中的源码,链接如下:

展开阅读全文

没有更多推荐了,返回首页