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”
这说明我们上面的判断是正确的。
下面是项目中的源码,链接如下: