Maven学习(五)-- 聚合与继承
标签(空格分隔): 学习笔记
Maven的聚合特性能够把项目的各个模块聚合在一起构建;
Maven的继承特性能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能够促进各个模块配置的一致性。
account-persist模块
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.park.mvnDemo.account</groupId>
<artifactId>account-persist</artifact>
<name>Account Persist</name>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifact>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifact>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifact>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifact>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifact>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<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>
</build>
</project>
account-persist模块还需要一个SpringFramework的配置文件,位于src/main/resources
目录:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="propertyConfigure" class="org.springframework.beans.factory.config.PropertyPlaceholderconfigure">
<property name="location" value="classpath:account-service.properties"/>
</bean>
<bean id="accountPersistService" class="com.park.mvnDemo.account.persist.AccountPersistServiceImpl">
<property name="file" value="${persist.file}"/>
</bean>
<beans>
聚合
我们想要一次构建两个项目,而不是到两个模块的目录下分别执行mvn
命令 -- Maven的聚合就是为该需求服务的。
为了能够使用一条命令就能构建account-email
和account-persist
两个模块,需要创建一个额外的名为account-aggregator
的模块,然后通过该模块构建整个项目的所有模块。
account-aggregator
也有它自己的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.park.mvnDemo.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>
</modules>
</project>
在上面的xml文件中,
packaging
的方式为pom。对于聚合模块来说,其打包方式必须为pom,否则无法构建!
- modules: 这里是实现聚合的最核心的配置,可以声明任意数量的module元素来实现元素的聚合;
- 其中,每个module的值为当前POM的相对路径;
- 如:当前POM位于
D:\m2\code\account-aggregator\pom.xml
, 另有一个项目A位于D:\m2\code\account-aggregator\account-email/
,一个项目B位于D:\m2\code\-aggregatoraccount\account-persist/
,与上面的module值相对应。 - 为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在。
继承
在我们已经聚合的项目中,有很多重复的配置,有相同的groupId和version,有相同的spring-core, spring-beans, spring-context和juit依赖,造成大量的浪费也会引发问题,所以如何使用继承机制来统一配置这些重复的信息,做到”一处声明,处处使用“呢?
思路:创建POM的父子结构,在父POM中声明一些配置供子POM继承、
父模块
在account-aggregator
目录下创建POM的父目录account-parent
,内部的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.park.mvnDemo.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0</version>
<packaging>dom<packaging>
<name>Account Parent</name>
</project>
作为父模块的POM,其打包类型也是只能为pom。
由于父模块只是为了帮助消除配置的重复,因此她本身不包含除POM外的项目文件,也就不需要src/main/java
之类的文件了。
子模块 -- account-email
<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.park.mvnDemo.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0</version>
<relativePath>../account-parent/pom.xml</relativePath>
</parent>
<artifactId>account-email</artifactId>
<name>Account Email</name>
<dependencies>
...
</dependencies>
<build>
<plugins>
...
</plugins>
</build>
</project>
(子模块account-persist的pom配置与之类似,不再赘述)
聚合模块 -- account-aggregator
<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.park.mvnDemo.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>dom</packaging>
<name>Account Aggregator</name>
<modules>
<module>account-parent</module>
<module>account-email</module>
<module>account-persist</module>
</modules>
</project>
可继承的POM元素
- groupId: 项目组ID,项目坐标的核心坐标;
- version: 项目版本,项目坐标的核心坐标;
- description: 项目的描述信息;
- organization: 项目的组织信息;
- inceptionYear: 项目的创始年份;
- url: 项目的URL地址;
- developers: 项目的开发者信息;
- contributors: 项目的贡献值和信息;
- distributionManagement: 项目的部署配置;
- issueManagement: 项目的缺陷跟踪系统;
- ciManagement: 项目的持续集成系统信息;
- scm: 项目的版本控制系统信息;
- mailingLists: 项目的邮件列表信息;
- properties: 自定义的Maven属性;
- dependencies: 项目的依赖配置;
- dependencyManagement: 项目的依赖管理配置;
- repositories: 项目的仓库配置;
- build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
- reporting: 包括项目的报告输出目录配置、报告插件配置等。
依赖管理
dependencies可以使得子模块继承父模块依赖的插件,同时dependencyManagement元素又能保证子模块使用的灵活性。在dependencyManagement元素下的声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。
示例:
(一) 在account-parent中配置dependencyManagement元素
<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.park.mvnDemo.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0_SNAPSHOT</version>
<packaging>dom</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</artifact>
<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>
</depedencyManagement>
</project>
(二) 继承了dependencyManagement的account-email POM
<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>
如果不声明某个依赖,那这个依赖就不会被引入。
插件管理
Maven提供了pluginManagement元素来管理插件。在该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中配置的插件相匹配时,pluginManagement的配置才会影响实际的插件行为。
(一) 在父POM中配置pluginManagement
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify<phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</exeuction>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
(二) 在子模块中配置相应的插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
</build>
聚合与继承的关系
- 聚合是为了方便快速构件项目。对于聚合模块来说,它知道有哪些被聚合的模块,但那些模块不知道这个聚合模块的存在;
- 继承是为了消除重复配置。对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但是子模块必须知道自己的父POM是什么。
在实际的项目中,一个POM可以既是聚合POM,又是父POM。
如果父模块位于子模块们的上级,则不需要再额外配置relativePath
,因为Maven默认能识别父模块的位置。
反应堆(Reactor)
在一个多模块的Maven项目中,反应堆是指所有模块组成的一个构件结构。包含了各模块之间继承于依赖的关系,从而能够自动计算出合理的模块构件顺序。
Maven实际的构建顺序是:Maven按序读取POM,如果该POM没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖模块还依赖于其他模块,则进一步先构建其他模块。
模块间的依赖关系会将反应堆构成一个有向无环图(DAG: Directed Acyclic Graph),各个模块是该图的节点,依赖关系构成了有向边。
裁剪反应堆
当用户并不想构建整个项目的时候,就需要实时地裁剪反应堆。
Maven提供很多命令行支持裁剪反应堆:
-am, --alsomake
: 同时构建所列模块的依赖模块模块;-amd, --also-make-dependents
: 同时构建依赖于所列模块的模块;-pl, --projects<arg>
: 构建指定模块,模块间用逗号分割;-rf, -resume-from<arg>
: 从指定的模块回复反应堆。$ mvn clean install
\\Output: Account Aggregator, Account Parent, Account Email, Account Persist
$ mvn clean install -pl account-email,account-persist
\\Output: Account Email, Account Persist
$ mvn clean install -pl account-email -am
\\Output: Account Parent, Account Email
$ mvn clean install -pl account-parent -amd
\\Output: Account Parent, Account Email, Account Persist
$ mvn clean install -rf account-email
\\Output: Account Email, Account Persist
$ mvn clean install -pl account-parent -amd -rf account-email
\\Output: Account Email, Account Persist
Maven学习(五)-- 聚合与继承的更多相关文章
- Maven学习总结——聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- (转)Maven学习总结(五)——聚合与继承
孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(五)——聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <mod ...
- maven项目的聚合与继承
maven项目的聚合与继承: 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模 ...
- Maven学习总结(五)——聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module>模块一</module> & ...
- 转】Maven学习总结(五)——聚合与继承
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4058008.html 感谢! 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1. ...
- maven学习(十一)——maven中的聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module>模块一</module> & ...
- Maven学习5-聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- maven 依赖、聚合和继承 (转)
Maven 插件和仓库 Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,仅仅定义了抽象的生命周期,所有这些任务都交给插件来完成的.每个插件都能完成至少一个任务,每个任务即是一个功 ...
- Maven学习(八)继承和聚合
*聚合(多模块) 在一个项目中 往往有多个模块组成,例如有项目demo下面有a, b两个模块 为了能使用一条命令就能构建demo-a, demo-b两个模块, 需要创建一个额外的聚合模块, 然后通过该 ...
- (五)Maven中的聚合和继承
一.为什么要聚合? 定义:我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我 ...
随机推荐
- BizTalk开发系列(三十三)BizTalk之Excel终极解决方案
Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapte ...
- Android课程---Activity中保存和恢复用户状态
onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chens ...
- jquery ajax 对异步队列defer与XMLHttprequest.onload的依赖
ajax 对异步队列defer与XMLHttprequest.onload的依赖
- ios-model数据结构
主要作用:简化VC代码,便于请求数据中字段的增.删.查.找,以及后期代码维护. 一.构建Model. 创建继承于NSObject的PlaceOrderModel #import <Foundat ...
- Jquery--防止冒泡
e.stopPropagation();//阻止冒泡
- DataGridView key points
Simple Examples => http://csharp.net-informations.com/datagridview/csharp-datagridview-readonly-c ...
- css3学习----transform
css 2D转换
- Java 隐藏和覆盖
我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...
- 带你玩转JavaWeb开发之三 - CSS从基础到实战
一,什么是CSS? Cascading Style Sheets层叠样式表 层叠:就是层层覆盖叠加,如果有多种样式对同一html标签进行修饰,样式有冲突的部分应用优先级高,不冲突的 ...
- 转:EntityFramework查询--联合查询(Join,GroupJoin)
首先我们先看一下Join public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this ...