mvn实战总结-8章 聚合与继承

本文详细介绍了Maven的聚合和继承特性,展示了如何利用聚合构建多模块项目,以及如何通过继承简化配置并确保一致性。聚合项目通过指定子模块进行统一构建,而继承则允许子模块共享父模块的依赖和插件配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mvn的聚合特性能够把项目的各个模块聚合在一起构建。
mvn的继承特性能够帮助抽取各个模块的相同的依赖和插件配置,简化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 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.juvenxu.mvnbook.account</groupId>
	<artifactId>account-aggregator</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>Account Aggregator</name>
	<modules>
		<module>account-email</module>
		<module>account-persist</module>
		<module>account-parent</module>
	</modules>
</project>
  1. 聚合项目的packaging类型必须为pom
  2. 在聚合项目中需要通过modules指定子模块;其中模块的路径是相对于聚合项目pom文件的路径
  3. 聚合项目的构建的过程,mvn会解析聚合项目的pom文件,之后解析出构建的依赖顺序,之后依次构建所有模块。

项目的继承

建立pom文件的父子结构,让子pom继承父pom来实现一次声明多次使用的目的。

  • 父pom不需要定义src/main/java等文件,只需要定义pom
  • 子pom中需要通过relativePath指定父pom的位置,默认值为…/pom.xml;既默认会上层当前项目的上层目录中查找

可以继承的pom元素

  1. groupId:项目组id
  2. version 项目版本
  3. description 项目的描述信息
  4. organization 项目的组织信息
  5. inceptionYear 项目的创始年份
  6. url 项目的url地址
  7. developers 项目的开发者信息
  8. contributors 项目的贡献者信息
  9. distributionManagement 项目的部署配置
  10. issueManagement 项目的缺陷跟踪系统
  11. ciManagement 项目的持续集成系统
  12. scm 项目的版本控制系统信息
  13. mailingLists 项目的邮件列表信息
  14. properites 自定义的mvn属性
  15. dependencies 项目的依赖配置
  16. dependencyManagement 项目的依赖管理配置
  17. repositories 项目的仓库配置
  18. build 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
  19. reporting 项目的报告输出目录配置、报告插件配置

dependencyManagement

dependencyManagement 声明的依赖不会给父pom引入依赖,也不会给子模块引入依赖,但是是可以继承的。
这样在子pom中声明依赖只需要指定groupid和artifactid,不再需要指定version,这样做的好处是能够统一项目中依赖的版本,可以避免多个木块中依赖版本不一致的问题。

插件管理

mvn也提供了pluginManagement 元素帮助管理插件。该元素中的配置依赖不会造成实际的插件调用行为,当pom中配置了真正的plugin元素,并且其groupId与artifactId与pluginManagement中配置的插件匹配时,pluginManagement的配置才会影响实际的插件行为。

聚合与继承的关系

多模块Mvn项目中的聚合与继承其实是两个概念,其目的是完全不同的。前者主要是为了方便的快速构建项目,后置主要是为了消除重复的配置。
对于聚合模块来书,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的pom来说,他不知道有哪些子模块继承它,但那些子模块都必须知道自己的父模块
在现实的实际项目中,一个POM即使聚合pom又是父POM,这么做是为了方便。

反应堆

在一个多模块的mvn项目中,反应堆是指所有模块组成的一个构建结构。对于单模块项目,反应堆就是项目本身,对于多模块项目来说,反应堆就包含了各个模块之间的依赖和继承关系,从而能够计算出合理的模块构建顺序。
父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 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.juvenxu.mvnbook.account</groupId>
	<artifactId>account-parent</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>Account Parent</name>
	<properties>
		<springframework.version>2.5.6</springframework.version>
		<junit.version>4.7</junit.version>
	</properties>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-core</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context-support</artifactId>
				<version>${springframework.version}</version>
			</dependency>
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<configuration>
						<source>1.5</source>
						<target>1.5</target>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-resources-plugin</artifactId>
					<configuration>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

子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 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<parent>
		<groupId>com.juvenxu.mvnbook.account</groupId>
		<artifactId>account-parent</artifactId>
		<version>1.0.0-SNAPSHOT</version>
		<relativePath>../account-parent/pom.xml</relativePath>
	</parent>
	
	<artifactId>account-email</artifactId>
	<name>Account Email</name>

	<properties>
		<javax.mail.version>1.4.1</javax.mail.version>
		<greenmail.version>1.3.1b</greenmail.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>		
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>			
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>			
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>			
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>${javax.mail.version}</version>
		</dependency>		
		<dependency>
			<groupId>com.icegreen</groupId>
			<artifactId>greenmail</artifactId>
			<version>${greenmail.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
	</build>

</project>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值