第一部分 Maven的继承
1 概念
Maven工程之间,A 工程继承 B 工程
B 工程:父工程A 工程:子工程本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。
2 作用
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。
3 它的背景是:
对一个比较大型的项目进行了模块拆分。一个 project 下面,创建了很多个 module。每一个 module 都需要配置自己的依赖信息。
4 它背后的需求是:
在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
在一个工程中依赖多个 Spring 的 jar 包
TIP [INFO] +- org.springframework:spring-core:jar:4.0.0.RELEASE:compile [INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile [INFO] +- org.springframework:spring-beans:jar:4.0.0.RELEASE:compile [INFO] +- org.springframework:spring-context:jar:4.0.0.RELEASE:compile [INFO] +- org.springframework:spring-expression:jar:4.0.0.RELEASE:compile [INFO] +- org.springframework:spring-aop:jar:4.0.0.RELEASE:compile [INFO] | \- aopalliance:aopalliance:jar:1.0:compile
使用 Spring 时要求所有 Spring 自己的 jar 包版本必须一致。为了能够对这些 jar 包的版本进行统一管理,我们使用继承这个机制,将所有版本信息统一在父工程中进行管理。
5 创建父类工程
创建的过程和前面创建Maven的Java项目一样,你可以点击这个连接进行查看我之前手动创建的Maven的Java项目,现在我们还是使用手动的方式来创建,后面会说如何使用开发工具idea进行创建。
工程创建好之后,要修改它的打包方式:
<groupId>com.csdn.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --> <packaging>pom</packaging>
只有打包方式为 pom 的 Maven 工程能够管理其他 Maven 工程。打包方式为 pom 的 Maven 工程中不写业务代码,它是专门管理其他 Maven 工程的工程。
②创建模块工程
模块工程类似于 IDEA 中的 module,所以需要进入 pro03-maven-parent 工程的根目录,然后运行 mvn archetype:generate 命令来创建模块工程。
模块工程类似于 IDEA 中的 module,所以需要进入 pro03-maven-parent 工程的根目录,然后运行 mvn archetype:generate 命令来创建模块工程。
假设,我们创建三个模块工程:
6 解读 父类工程 的pom.xml文件
1 坐标 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.java.maven</groupId> <artifactId>pr03-maven-java</artifactId> <version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version> <!-- 修改他的打包方式 当前工程为父工程 要去管理其他工程 打包方式为pom --> <packaging>pom</packaging> <name>pr03-maven-java</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
2 maven的聚合
<modules> <module>pro04-maven-java</module> <module>pro05-maven-java</module> <module>pro06-maven-java</module> </modules>
3 在父工程中写的程序 在子工程中没有被引用
<!-- 使用dependencyManagement标签配置对依赖的管理 --> <!-- 被管理的依赖并没有真正被引入到工程 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.0.RELEASE</version> </dependency> </dependencies> </dependencyManagement> </project>
#### 然后在子工程中运行mvn dependency:list,效果如下: ``` TIP [INFO] org.springframework:spring-aop:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-core:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-context:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-beans:jar:4.1.4.RELEASE:compile [INFO] org.springframework:spring-expression:jar:4.1.4.RELEASE:compile ```
<!-- 通过自定义属性,统一指定Spring的版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ```xaml <!-- 自定义标签,维护Spring版本数据 --> <csdn.spring.version>4.3.6.RELEASE</csdn.spring.version> ``` </properties>
在需要的地方使用${}的形式来引用自定义的属性名: