Maven实战——聚合与继承(上)
2015-06-03 18:29
369 查看
聚合
首先我们来看两个pom.xml文件,我们将通过这两个pom文件来引入我们要学习的聚合与继承
account-email
account-persist
请耐住性子看下这两段pom文件,他们的groupId和version模块完全一样,而artifactId也有相同的前缀。一般来说一个项目的子模块都应该使用同样的groupId,如果他们一起开发和发布还应该使用相同的version,此外他们的artifactId还应该使用相同的前缀,以便同其他项目区分。
这是一个简单而自然的需求就显现出来了:我们会想要一次构建两个项目,而不是到两个模块的目录下分别执行们命令。Maven的聚合(或者多模块)这一特性就是为该需求服务的。
为了能使用一条命令就能构建account-email和account-persist我们还需要额外建一个account-aggregator模块,然后通过该模块构建整个项目所有模块。account-aggregator作为一个maven项目他需要有自己的pom,如下:
上述pom使用了相同的groupId和artifactId,版本也一致,这里第一个特殊的地方时packaging为pom,而其他两个没有配置即默认:jar。对于聚合模块来说其打包方式必须为pom,否则无法构建。
一般来说为了方便快速定位内容,模块所处的目录名称应当与其artifactId一致。为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在,这样当用户得到源码的时候第一眼发现的就是聚合模块的pom,不用从多个模块中去寻找聚合模块来构建整个项目。
如下图所示:
聚合模块的父子目录结构
如果使用平衡目录结构聚合模块的pom文件需要进行修改如下:
执行Maven命令如下:
继承
通过聚合我们可以通过使用一条命令同时构建多个模块,通过仔细观察我们看到这两个模块的pom文件有很多重复的地方。有相同的groupId和version,spring-beans,spring-core等,而继承可以消除重复。
我们继续以account-persist为基础,在account-aggregator下创建一个名为account-parent的子目录,然后在该子目录下建立一个所有出account-aggregator之外模块的父模块
有了父模块,就需要让其他模块来继承他。首先将account-email的pom修改如下
relativePath的默认值是../pom.xml,也就是说Maven默认父pom在上一层目录下。account-email没有显式的声明groupId和version,他会隐式的从父模块继承这两个子元素。如果子模块的version和父模块不一致完全可以自己显式声明。
最后同样还需要把account-parent加入到聚合模块account-aggregator中,代码如下:
下面我们来了解下有哪些pom元素的可以被继承
groupId:项目组Id,项目坐标核心元素
version:项目版本,项目坐标核心元素
description:项目描述信息
organization:项目的组织信息
inceptionYear:项目创始年份
url:项目的URL地址
developers:项目开发者信息
contributor:项目贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目缺陷跟踪信息
ciManagement:项目持续集成系统信息
scm:项目的版本控制信息
mailingLists:项目的邮件列表信息
properties:自定义的Maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目的仓库配置
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting:包括项目的报告输出目录配置、报告插件配置
首先我们来看两个pom.xml文件,我们将通过这两个pom文件来引入我们要学习的聚合与继承
account-email
<modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-email</artifactId> <name>Account Email</name> <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build>
account-persist
<modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-persist</artifactId> <name>Account Persist</name> <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>javax.dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> </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>
请耐住性子看下这两段pom文件,他们的groupId和version模块完全一样,而artifactId也有相同的前缀。一般来说一个项目的子模块都应该使用同样的groupId,如果他们一起开发和发布还应该使用相同的version,此外他们的artifactId还应该使用相同的前缀,以便同其他项目区分。
这是一个简单而自然的需求就显现出来了:我们会想要一次构建两个项目,而不是到两个模块的目录下分别执行们命令。Maven的聚合(或者多模块)这一特性就是为该需求服务的。
为了能使用一条命令就能构建account-email和account-persist我们还需要额外建一个account-aggregator模块,然后通过该模块构建整个项目所有模块。account-aggregator作为一个maven项目他需要有自己的pom,如下:
<modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-aggregator</artifactId> <name>Account Aggregator</name> <packaging>pom</packaging> <version>1.0.0-SNAPSHOT</version> <modules> <module>account-email</module> <module>account-persist</module> </modules>
上述pom使用了相同的groupId和artifactId,版本也一致,这里第一个特殊的地方时packaging为pom,而其他两个没有配置即默认:jar。对于聚合模块来说其打包方式必须为pom,否则无法构建。
一般来说为了方便快速定位内容,模块所处的目录名称应当与其artifactId一致。为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在,这样当用户得到源码的时候第一眼发现的就是聚合模块的pom,不用从多个模块中去寻找聚合模块来构建整个项目。
如下图所示:
聚合模块的父子目录结构
如果使用平衡目录结构聚合模块的pom文件需要进行修改如下:
<modules> <module>../account-email</module> <module>../account-persist</module> </modules>
执行Maven命令如下:
继承
通过聚合我们可以通过使用一条命令同时构建多个模块,通过仔细观察我们看到这两个模块的pom文件有很多重复的地方。有相同的groupId和version,spring-beans,spring-core等,而继承可以消除重复。
我们继续以account-persist为基础,在account-aggregator下创建一个名为account-parent的子目录,然后在该子目录下建立一个所有出account-aggregator之外模块的父模块
<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>
有了父模块,就需要让其他模块来继承他。首先将account-email的pom修改如下
<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> <dependencies> ... </dependencies> <build> <plugins> ... </plugins> </build>
relativePath的默认值是../pom.xml,也就是说Maven默认父pom在上一层目录下。account-email没有显式的声明groupId和version,他会隐式的从父模块继承这两个子元素。如果子模块的version和父模块不一致完全可以自己显式声明。
<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>
<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-persist</artifactId>
<name>Account Persist</name>
<dependencies>
...
</dependencies>
<build>
<testResources>
<directory>src/test/resources</directory>
<filtering>true</filtering>
<testResource>
<plugins>
...
</plugins>
</build>
最后同样还需要把account-parent加入到聚合模块account-aggregator中,代码如下:
<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-parent</module> <module>account-email</module> <module>account-persist</module> </modules>
下面我们来了解下有哪些pom元素的可以被继承
groupId:项目组Id,项目坐标核心元素
version:项目版本,项目坐标核心元素
description:项目描述信息
organization:项目的组织信息
inceptionYear:项目创始年份
url:项目的URL地址
developers:项目开发者信息
contributor:项目贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目缺陷跟踪信息
ciManagement:项目持续集成系统信息
scm:项目的版本控制信息
mailingLists:项目的邮件列表信息
properties:自定义的Maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目的仓库配置
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting:包括项目的报告输出目录配置、报告插件配置
相关文章推荐
- 一个优势的公司基本不可能再被同样的产品颠覆了(应该创新,从而干掉旧的需求基础)
- 福建网龙招.net工程师,有意者回复啊
- JS-资料收录
- [水]1065 牛棚回声
- Android学习资源
- nginx 重写 rewrite 基础及实例
- JS-通信API
- JS-Web Workers处理线程
- JS-applicationCache对象
- 清空JPA二级缓存
- 4.4-3
- 人丑就要多读书(6)
- tomcat部署项目 以及 如何去掉项目名称
- Navicat for Mysql 只导出数据表结构(.sql文件)的方法
- Gson 字符串和json对象的转换
- Bluemix云平台实践:构建可穿戴应用(2)
- 关于mysql数据库在运行中出现MySQL server has gone away的问题解决
- 49.关键帧动画
- 123123
- JS-Web Storage