maven实战(四)聚合与继承
来源:互联网 发布:域名更新 编辑:程序博客网 时间:2024/05/23 12:58
我们知道maven构建项目是根据pom文件来构建的,一般一个应用是分成多个模块,每个模块都有自己的pom.xml,这样是不是就需要分多次构建,maven提供了聚合功能,可以使一个父类模块聚合所有模块。例子如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi:schemaLocation="http://maven.apache.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>accout-aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <packing>pom</packing> <name>Accout Aggregator</name> <modules> <module>account-email</module> <module>accout-persist</module> <modules></project>
上述POM使用了与项目中其他pom共同的groupId com.juvenxu.mvnbook.account,artifactId为独立的account-aggregator,版本也与其他两个模块一致,为1.0.0-SNAPSHOT。这里第一个特殊的地方为packaging,其值为POM。一般我们不声明packaging,默认就是jar类型。对于聚合模式来说,其packaging必须是POM否则就无法构建。
之后是modules,这是实现聚合模式的最核心配置。用户可以在一个打包方式为pom的文件中声明任意数量的module元素来实现模块聚合。这里每个module的值都是一个当前POM的相对目录,譬如该例中,account-aggregator的POM路径为D:\...\code\ch-8\account-aggregator\pom.xml,那么account-email就对应了目录D;\...\code\ch-8\account-aggregato\account-email,而accout-persist对应于目录D:\...\code\ch-8\account-aggregator\account-persist。这两个目录各自包含了pom.xml,src/main/java/,/src/test/java等内容,离开account-aggregator也能独立构建。
为了方便构建项目,通常将聚合模块放在项目的最顶层,其他模块则作为聚合模块的子目录存在,这样当用户得到源码的时候,第一眼发现的就是聚合模块的POM,不用从多个模块中去寻找聚合模块来构建整个项目。下图为account-aggregator与另外两个模块的目录结构关系。
从上图可以看到,account-aggreagator的内容仅仅是一个pom.xml文件,它不像其他模块那样有src/main/java、src/test/java等目录。这也是容易理解的,聚合模块仅仅是帮助聚合其他模块构建的工具,它本身并无实质内容。
继承
<modelVersion>4.0.0</modelVersion><grouanpId>com.juvenxu.mvnbook.account</groupId><artifactId>account-parent</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><name>Account Parent</name>
该pom十分简单,它使用了与其他模块一致的groupId和version,需要特别注意的是它的packaging为pom。这一点与聚合模块一样,作为父模块的pom,其打包类型必须为pom。由于父模块只是为了帮助消除配置的重复,因此它本身并不包含POM之外的项目文件,也就不需要src/main/java之类的文件夹了。有了父模块就要有其他模块来继承它,首先将account-email的POM修改如下:
<modelVersion>4.0.0</modelVersion><parent> <groupId>com.juvenxu.mvnbook.accout</groupId> <artifactId>account-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../account-parent/pom.xml</relativePath></parent><artifactId>account-email</artifactId><dependencies> ...</dependencies>
上述pom中使用parent元素声明父模块,parent下的子元素groupId、artifactId和version指定了父模块的坐标,这三个元素是必须的。元素relativePath表示父模块pom的相对路径,该例中的../account-parent/pom.xml表示父pom的位置在与account-email/目录平行的account-parent/目录下。当项目构建时,maven会首先根据relativePath检查父pom,如果找不到,再从本地仓库找。relativePath的默认值是../pom.xml,也就是说,maven默认父pom在上一层目录下。
可继承的pom元素
groupId
依赖管理
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww.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> <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></project>
这里使用dependencyManagement声明的依赖既不会给account-parent引入依赖,也不会给它的子模块引入依赖,不过这段配置是会被继承的。现在修改account-emai的POM如下:
<project>... <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.juvenxu.mvnbook.account</groupId> <parent>account-parent</parent> <version>1.0.0-SNAPSHOT</version> <relativePath>../account-parent/pom.xml</relativePath> </parent> <artifactId>account-email</artifactId> <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>...</project>
<parent> <groupId>com.juvenxu.mvnbook.account</groupId> <artifactId>account-parent</artifactId> <version>1.0.0-SNAPSHOT</version></parent><artifactId>account-email</artifactId><name>Account Email</name>...
超级POM
<repositories> <repository> <id>central</id> <name>Maven Repository Switchboard</name> <url>http://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository></repositories><pluginRepositories> <pluginRepository> <id>central</id> <name>Maven Plugin Repository</name> <url>http://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository></pluginRepositories>首先超级POM定义了仓库及插件仓库,两者的地址都为中央仓库http://repo1.maven.org/maven2,并且都关闭了SNAPSHOT的支持。这也解释了为什么Maven默认可以按需要从中央仓库下载构件。
<build> <directory>${project.basedir}/target<directory> <outputDirectory>${project.build.directory}/classed</outputDirectory> <filename>${project.artifactId}-${project.version}</filename> <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSoutceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> </testResoutce> </testResources>这里一次定义了项目的主输出目录、主代码输出目录、最终构件的名称格式、测试代码输出目录、主源码目录、脚本源码目录、测试源码目录、主资源目录和测试资源目录。这就是maven项目结构的约定。
<pluginManagement> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-4</version> </plugin> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.3</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> </plugin> ... </plugins></pluginManagement></build>
这里就不一一列举了。
maven反应堆
<modules> <module>account-email</module> <module>account-persist</module> <module>account-parent</module></modules>通过mvn clean install发现它会先构建parent而不是按照顺序构建,这是因为maven的反应堆,当构建account-email的时候,发现它依赖了parent,所以就会先构建parent。
- maven实战(四)聚合与继承
- 《maven实战》读书笔记(四)——聚合与继承
- Maven实战——聚合与继承(上)
- Maven实战——聚合与继承(中)
- Maven实战——聚合与继承(下)
- Maven 实战 05 聚合与继承
- 【Maven实战】学习之聚合与继承
- Maven学习笔记(四)--聚合与继承
- maven学习日志之四 Maven的聚合与继承
- Maven聚合与继承
- Maven聚合与继承
- Maven聚合与继承
- Maven聚合与继承
- Maven聚合与继承
- Maven 聚合与继承
- Maven聚合与继承
- maven聚合与继承
- Maven聚合与继承
- [日常训练] 联络网
- POJ3680 Intervals
- iOS性能自动化之instruments
- POJ 3070 Fibonacci(矩阵快速幂)
- block,inline-block,inline之间的区别
- maven实战(四)聚合与继承
- 给java初学者的部分笔记3!
- toad edit界面 执行大量脚本(2w+)挂死解决办法
- 安装memcache
- python——asyncio模块实现协程、异步编程(三)
- 字符串插入的简单实现
- HDU2011
- 你对MVC的理解,MVC有什么优缺点?结合Struts,说明在一个Web应用如何去使用?
- day06_02包 this 封装继承