- 先声明者优先
案例:根据上述案例场景,其他代码不变,假如模块maven_makefriend在pop.xml中同时引入模块maven_make与maven_hellofriend的jar包,那它会用哪个版本的log4j的jar包?
模块maven_makefriend在pop.xml中同时引入模块maven_make与maven_hellofriend的jar包
代码示例如下:
<?xml version="1.0" encoding="UTF-8"?> <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_test</artifactId> <groupId>com.bd</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>maven_makefriend</artifactId> <dependencies> //同时引入模块maven_make与maven_hellofriend的jar包 <dependency> <groupId>com.bd</groupId> <artifactId>maven_make</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.bd</groupId> <artifactId>maven_hellofriend</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
三. 在Maven中如何统一管理依赖的版本号?
语法:
示例代码如下
<properties> <spring-version>5.3.17</spring-version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring-version]</version> </dependency> </dependencies>
ps:
这样做的好处是只需要修改一处,即
<properties></properties>
内的版本号,就可以修改多处的值,即<dependencies></dependencies>
内所有应用${spring-version} 的值。在外面定义版本号,里面使用,然后统一管理,统一修改相关jar包的版本号,进而提高编码效率。
四. Maven中的继承是什么?
4.1 为什么需要继承?
原因:
如果有多个子工程都使用同一个jar包,则可以将该jar包提取到父工程中,使用【继承原理】在子工程中使用,类似于Java中的子类继承父类
注意:
父工程的打包方式【jar/war/pom】,必须是pom方式
4.2 Maven的继承方式一
用法:
只需要在父工程中的pop.xml中引入指定jar包的坐标,那么它所有的子工程都默认强制引入父工程中的所有jar包
案例:在父工程maven_demo内创建两个子工程(day01_mavenTest与day01_mavenTest1)与一个工程day01_mavenHello,在父工程内的pop.xml里引入两个jar包(junit
4.12和junit-jupiter-api 5.9.2),其他工程内pop.xml不做任何jar包的坐标引入,演示观察继承效果
示例代码如下:
在父工程的pop.xml 引入两个jar包的坐标(junit 4.12和junit-jupiter-api 5.9.2)
//父工程的pop.xml 引入两个jar包的坐标(junit 4.12和junit-jupiter-api 5.9.2) <?xml version="1.0" encoding="UTF-8"?> <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.bd</groupId> <artifactId>maven_demo</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>day01_mavenTest</module> <module>day01_mavenTest1</module> </modules> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> </dependencies> </project>
有一个问题?
假设在上述案例场景中,子工程day01_mavenTest1的pop.xml内想要引入junit 4.11的jar包坐标,那么它的依赖目录下会应用从父工程继承的junit 4.12 的jar包,还是在pop.xml中准备引入的junit 4.11的jar包?
答案:子工程day01_mavenTest1的依赖中会应用pop.xml中准备引入的junit 4.11的jar包,原因是根据依赖的传递性规则中最短路径者优先【就近原则】。
如下所示:
4.3 Maven的继承方式二
在该继承方式中,子工程可以自由选择应用从父工程继承的jar包资源
用法:
①在父工程中的pop.xml将导入的jar包放入
<dependencyManagement></dependencyManagement>
内。
示例代码如下:
//在父工程中的pop.xml里导入junit 4.12 的jar包,不过是放在 //dependencyManagement</dependencyManagement>内 <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
②在子工程中的pop.xml中引入父工程的相关jar包,要这样写(如下所示)
示例代码如下:
<parent> <artifactId>maven_demo</artifactId> <groupId>com.atguigu</groupId> <version>1.0-SNAPSHOT</version> //加入下面的代码,要写父工程pop.xml的相对路径 <relativePath>../pom.xml</relativePath> </parent> //注意不能加要引入jar包的版本号 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
注意: 绝对不能添加指定导入的jar包的版本号
案例:在父工程maven_demo内创建两个子工程(day01_mavenTest与day01_mavenTest1)与一个工程day01_mavenHello,在父工程内的pop.xml里引入两个jar包(junit
4.12和junit-jupiter-api 5.9.2),使用上述语法引入,子工程day01_mavenTest内的pop.xml使用继承方式二的语法引入父工程junit 4.12 的jar包的坐标引,演示观察继承效果
①父工程maven_demo内pop.xml中导入相关jar包
示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <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.bd</groupId> <artifactId>maven_demo</artifactId> //规定父工程的打包方式必须是pom <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>day01_mavenTest</module> <module>day01_mavenTest1</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
②子工程day01_mavenTest的pop.xml内指定引入夫父工程中junit 4.12 的jar包
示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <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_demo</artifactId> <groupId>com.bd</groupId> <version>1.0-SNAPSHOT</version> <!-- 以相对路径引入父工程pop.xml --> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>day01_mavenTest</artifactId> <!-- 指定导入父工程中的junit 4.12 的jar包 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> </project>
五. Maven 的聚合是什么?
释义:
在 Maven 中,聚合(Aggregation)是将多个项目组织在一起构建的一种特殊方式。这可以使多个项目成为单个构建,在一个命令下执行所有构建步骤。
聚合通常用于处理具有相同构建要求的多个项目。例如,大型应用程序可能由多个模块组成,每个模块都需要编译、测试、打包和部署成独立的库或组件。在这种情况下,可以将所有模块配置为使用 Maven 聚合进行构建,并使用一个父级 pom.xml 文件来定义它们之间的关系。
5.1 如果不使用Maven的聚合,会发生什么?
如果不使用聚合功能,在项目中就不能管理多个子模块,也不能一次性构建整个代码库。此外,没有聚合,每个模块都需要单独编译、测试和部署,增加了工作量和复杂度。因此,使用Maven的聚合功能可以极大的简化项目的管理并提高开发的效率。
5.2 使用Maven聚合的好处
好处:
只要将子工程聚合到父工程中,就可以实现效果(安装或清除父工程时,子工程会进行同步操作)。换而言之,就是在点击父工程的install 或 clean,安装父工程的同时,它的子工程也会同时安装,clean时 一起 clean。
5.3 如何使用Maven的聚合?
Maven 使用
<modules>
元素管理所有相关的子工程(子模块)。该元素包含一系列<module>
子元素,其中每个子元素指定要聚合的 Maven 项目的目录名称
语法:
代码示例如下
<modules> <module>day01_mavenTest</module> <module>day01_mavenTest1</module> </modules>
<modules>
元素下包含了两个子元素,即 day01_mavenTest、day01_mavenTest1。这意味着 该pop.xml所在的Maven项目 将聚合这两个项目,并在一个命令下一起执行它们的构建。
注意是在要将某一个Maven项目作为聚合的“容器”,它负责聚合容纳其他要聚合的Maven项目,是身为“聚合容器”的Maven项目下的pop.xml里写,类似Java中的抽象类与接口的概念
案例:演示Maven聚合的功能(点击”install“功能 安装父工程时,则同时安装它子工程)
安装之前:
安装之后:
注意:
Maven会按照依赖顺序自动安装子工程