博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maven入门实战笔记-11节[6]
阅读量:5820 次
发布时间:2019-06-18

本文共 24564 字,大约阅读时间需要 81 分钟。

 
Maven入门实战笔记06-聚合与继承
 
目录一览:
聚合
继承
可继承的POM元素
依赖管理
插件管理
聚合与继承
约定优于配置
反应堆
 
 
 
聚合与继承概述:
Maven的聚合特性能够把各项目的各个模块聚合在一起构建;
Maven的继承特性能帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性。
-------------------------------------------------------
用到的项目  《Maven实战》(许晓斌 著) 一书中的一个用户登录注册的项目
-------------------------------------------------------
项目简介:用户注册服务,分为以下5个模块
account-web:包含与web相关的内容
account-service:系统核心,封装下层细节,对外暴露接口,Facade模式
account-persist:处理帐户信息持久化
account-captcha:处理验证码的key、图片的生成以及验证等
account-email:处理邮件服务的配置、激活邮件的编写和发送
-------------------------------------------------------
 
聚合
需求:一次构建这一个模块
创建一个account-aggregator的模块,然后通过该模块构建整个项目的所有模块
account-aggregator作为一个Maven项目,有自己的POM,同时也作为一个聚合项目
其pom.xml如下:
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.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-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
</project>  
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.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-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
</project>  
name字段是为了给项目提供一个更容易阅读的名字
 
packaging对应默认值为jar,对于聚合模块来说,其打包方式packaging的值必须为pom,否则无法构建。
moudles元素,实现聚合的核心配置
每个moudle的值都是一个当前POM的相对目录,如:
account-aggregator的pom.xml的路径为:
D:/WorkStation/maven/account-aggregator/pom.xml,
那么其它模块如account-web就对应了目录:
D:/WorkStation/maven/account-aggregator/account-web
一般,为快速定位内容,模块所处的目录名称应当与其artifactId一致(推荐非必须)
为方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其它模块则作为聚合模块的子目录存在
聚合模块仅仅是帮助聚合其他模块的工具,它本身并无实质内容,因此聚合模块的内容仅是一个pom.xml文件
以上配置是聚合模块的父子目录结构:
 
Java代码  
account-aggregator  
--pom.xml  
--account-email  
----src  
----pom.xml  
--account-persist  
----src  
----pom.xml  
Java代码  
account-aggregator  
--pom.xml  
--account-email  
----src  
----pom.xml  
--account-persist  
----src  
----pom.xml  
 对moudles作如下配置:
 
 
Java代码  
<modules>  
    <module>../account-email</module>  
    <module>../account-persist</module>  
    <module>../account-captcha</module>  
    <module>../account-service</module>  
    <module>../account-web</module>  
</modules>  
Java代码  
<modules>  
    <module>../account-email</module>  
    <module>../account-persist</module>  
    <module>../account-captcha</module>  
    <module>../account-service</module>  
    <module>../account-web</module>  
</modules>  
 则对应聚合模块的平行目录结构:
Java代码  
account-aggregator  
--pom.xml  
account-email  
--src  
--pom.xml  
account-persist  
--src  
--pom.xml  
Java代码  
account-aggregator  
--pom.xml  
account-email  
--src  
--pom.xml  
account-persist  
--src  
--pom.xml  
 
 
测试接口而不测试实现原则,测试代码不能引用实现类
 
继承
Maven的聚合特性可以通过一条命令同时构建N个模块,解决了多模块Maven项目的一个问题
问题:相同的配置、依赖。。。
POM的继承:通过继承机制抽取重复配置
一处声明多处使用
Java中,创建类的父子结构:父类中声明字段方法供子类POM继承
Maven中,创建POM的父子结构:父POM中声明一些配置供子POM继承
项目实例:
创建一个父模块account-parent,
在account-aggregator下创建一个名为account-parent的子目录,在该子目录下建立一个所有除account-aggregator之外的父模块,其pom.xml配置如下:
 
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.juvenxu.mvnbook.account</groupId>  
    <artifactId>account-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name>Maven Account-Parent Project</name>  
  
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
        <module>account-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
</project>  
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.juvenxu.mvnbook.account</groupId>  
    <artifactId>account-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name>Maven Account-Parent Project</name>  
  
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
        <module>account-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
</project>  
 注意:artifactId为account-parent,表示这是一个父模块
 
packaging为pom,作为父模块的POM,其打包类型也必须为pom
由于父模块只是为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件
其它模块来继承它,如account-email的POM(部分)如下:
 
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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>  
  
    <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>Maven Account-Email Project</name>  
  
    <dependencies>  
        。。。  
    </dependencies>  
  
    <build>  
        <plugins>  
            。。。  
        </plugins>  
    </build>  
</project>  
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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>  
  
    <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>Maven Account-Email Project</name>  
  
    <dependencies>  
        。。。  
    </dependencies>  
  
    <build>  
        <plugins>  
            。。。  
        </plugins>  
    </build>  
</project>  
 parent元素声明父模块,其下的groupId、artifactId和version指定了你模块的坐标,这三个元素必须的
relativePath元素表示你模块POM的相对路径,上述配置中的../account-parent/pom.xml表示父POM的位置在与account-email目录平行的account-parent目录下
 
Java代码  
account-aggregator  
--pom.xml  
--account-parent  
----pom.xml  
--account-email  
----src  
----pom.xml  
--account-persist  
----src  
----pom.xml  
Java代码  
account-aggregator  
--pom.xml  
--account-parent  
----pom.xml  
--account-email  
----src  
----pom.xml  
--account-persist  
----src  
----pom.xml  
 
 
relativePath的默认值是../pom.xml,也就是说,Maven默认父POM在上一层目录下
 
正确设置relativePath很重要,因为相互具有继承关系
 
 
Java代码  
account-aggregator  
--pom.xml  
account-parent  
--pom.xml  
account-email  
--src  
--pom.xml  
account-persist  
--src  
--pom.xml  
Java代码  
account-aggregator  
--pom.xml  
account-parent  
--pom.xml  
account-email  
--src  
--pom.xml  
account-persist  
--src  
--pom.xml  
对于artifactId元素,子模块应该显式声明,一方面,如果完全继承groupId、artifactId和version,会造成坐标冲突,另一方面,好使使用不同的groupId或version,同样的artifactId容易造成混淆
 
最后将父模块account-parent加入到聚合模块account-aggregator中,在聚合模块中的pom.xml中加入
 
Java代码  
<module>account-parent</module>  
Java代码  
<module>account-parent</module>  
 
总结:
1.聚合可以方便快速构建项目
2.继承可以避免重复配置
 
可继承的POM元素
groupId和version是可以被继承的,可以被继承的POM元素如下:
groupId
version
description
organization
inceptionYear
url
developers
contributors
distributionManagement:项目的部署配置
issueMagement
ciManagement
scm
mailingLists
properties
dependencies:项目的依赖配置
dependencyManagement
repositories
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting
依赖管理
依赖是会被继承的
Maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性
在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用,如在account-parent中加入dependencyManagement配置
 
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.juvenxu.mvnbook.account</groupId>  
    <artifactId>account-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name>Maven Account-Parent Project</name>  
  
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
        <module>account-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
  
    <!-- Maven属性 -->  
    <properties>  
        <project.build.sourceEncoding>  
            UTF-8  
        </project.build.sourceEncoding>  
        <project.reporting.outputEncoding>  
            UTF-8  
        </project.reporting.outputEncoding>  
        <project.version>1.0.0-SNAPSHOT</project.version>  
        <springframework.version>2.5.6</springframework.version>  
        <junit.version>4.10</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>  
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.juvenxu.mvnbook.account</groupId>  
    <artifactId>account-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name>Maven Account-Parent Project</name>  
  
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
        <module>account-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
  
    <!-- Maven属性 -->  
    <properties>  
        <project.build.sourceEncoding>  
            UTF-8  
        </project.build.sourceEncoding>  
        <project.reporting.outputEncoding>  
            UTF-8  
        </project.reporting.outputEncoding>  
        <project.version>1.0.0-SNAPSHOT</project.version>  
        <springframework.version>2.5.6</springframework.version>  
        <junit.version>4.10</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-email的POM如下:
 
 
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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>  
  
    <parent>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-parent</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
    </parent>  
  
    <artifactId>account-email</artifactId>  
    <name>Maven Account-Email Project</name>  
  
    <properties>  
        <javax.mail.version>1.4.1</javax.mail.version>  
        <greenmail.version>1.3.1b</greenmail.version>  
    </properties>  
  
    <!-- 依赖 -->  
    <dependencies>  
        <!-- 继承父pom -->  
        <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>  
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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>  
  
    <parent>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-parent</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
    </parent>  
  
    <artifactId>account-email</artifactId>  
    <name>Maven Account-Email Project</name>  
  
    <properties>  
        <javax.mail.version>1.4.1</javax.mail.version>  
        <greenmail.version>1.3.1b</greenmail.version>  
    </properties>  
  
    <!-- 依赖 -->  
    <dependencies>  
        <!-- 继承父pom -->  
        <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>  
 这种依赖管理机制似乎不能减少太多POM配置,不过推荐这样做,原因保持版本一致,降低依赖冲突的机率
 
如果子模块不声明依赖的使用,即使该依赖已经在父POM的dependencyManagement中声明了,也不会产生任何实际的效果
import依赖范围:该范围的依赖只在dependencyManagement元素下才有效果,使用该范围的依赖通常指向一个POM,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement配置,除了复制配置或者继承这两种方式外,还可以使用import范围依赖将这一配置导入,如:
Java代码  
<dependencyManagement>  
    <dependencies>  
        <dependency>  
            <groupId>com.juvenxu.mvnbook.account</groupId>  
            <artifactId>account-parent</artifactId>  
            <version>1.0-SNAPSHOT</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
    </dependencies>  
</dependencyManagement>  
Java代码  
<dependencyManagement>  
    <dependencies>  
        <dependency>  
            <groupId>com.juvenxu.mvnbook.account</groupId>  
            <artifactId>account-parent</artifactId>  
            <version>1.0-SNAPSHOT</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
    </dependencies>  
</dependencyManagement>  
 上述代码中依赖的type为pom,import范围依赖由于其特殊性,一般都是指向打包类型为pom的模块
 
如果有多个项目,它们使用的依赖版本都是一致的,则就可以定义一个使用dependencyManagement专门管理依赖的POM,然后在各个项目中导入这些依赖管理配置。
 
 
插件管理
Maven提供了pluginManagement元素管理插件,该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,pluginManagement的配置都会影响实际的插件行为
如:在父POM中配置pluginManagement
Java代码  
<build>  
    <!-- 插件 -->  
    <pluginManagement>  
        <plugins>  
            <!-- 支持java 5 -->  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-compiler-plugin</artifactId>  
                <version>2.3.2</version>  
                <configuration>  
                    <source>1.5</source>  
                    <target>1.5</target>  
                </configuration>  
            </plugin>  
            <!-- 使用UTF-8编码处理资源文件 -->  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-resources-plugin</artifactId>  
                <version>2.5</version>  
                <configuration>  
                    <encoding>UTF-8</encoding>  
                </configuration>  
            </plugin>  
        </plugins>  
    </pluginManagement>  
</build>  
Java代码  
<build>  
    <!-- 插件 -->  
    <pluginManagement>  
        <plugins>  
            <!-- 支持java 5 -->  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-compiler-plugin</artifactId>  
                <version>2.3.2</version>  
                <configuration>  
                    <source>1.5</source>  
                    <target>1.5</target>  
                </configuration>  
            </plugin>  
            <!-- 使用UTF-8编码处理资源文件 -->  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-resources-plugin</artifactId>  
                <version>2.5</version>  
                <configuration>  
                    <encoding>UTF-8</encoding>  
                </configuration>  
            </plugin>  
        </plugins>  
    </pluginManagement>  
</build>  
 
继承了pluginManagement后的插件配置
 
Java代码  
<build>  
    <plugins>  
        <!-- 继承父pom -->  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
        </plugin>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-resources-plugin</artifactId>  
        </plugin>  
    </plugins>  
</build>  
Java代码  
<build>  
    <plugins>  
        <!-- 继承父pom -->  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-compiler-plugin</artifactId>  
        </plugin>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-resources-plugin</artifactId>  
        </plugin>  
    </plugins>  
</build>  
 当项目中的多个模块有同样的插件配置时,应当将配置移到父POM的pluginManagement元素中
统一项目的插件版本,避免潜在的插件不一致或者不稳定问题,也更易于维护
 
聚合与继承
概述
聚合主要是为了方便快速构建项目
继承主要是为了消除重复配置
不同
对于聚合来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在
对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但那些子模块都必须知道自己的父POM是什么
共同
(1)聚合POM与继承关系的父POM的packaging都必须是pom;
(2)聚合模块与继承关系中的父模块除了POM之外都没有实际的内容
合并聚合和继承功能后的account-parent的POM配置
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.juvenxu.mvnbook.account</groupId>  
    <artifactId>account-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name>Maven Account-Parent Project</name>  
  
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
        <module>account-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
  
    <!-- Maven属性 -->  
    <properties>  
        <project.build.sourceEncoding>  
            UTF-8  
        </project.build.sourceEncoding>  
        <project.reporting.outputEncoding>  
            UTF-8  
        </project.reporting.outputEncoding>  
        <project.version>1.0.0-SNAPSHOT</project.version>  
        <springframework.version>2.5.6</springframework.version>  
        <junit.version>4.10</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>  
                <!-- 支持java 5 -->  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-compiler-plugin</artifactId>  
                    <version>2.3.2</version>  
                    <configuration>  
                        <source>1.5</source>  
                        <target>1.5</target>  
                    </configuration>  
                </plugin>  
                <!-- 使用UTF-8编码处理资源文件 -->  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-resources-plugin</artifactId>  
                    <version>2.5</version>  
                    <configuration>  
                        <encoding>UTF-8</encoding>  
                    </configuration>  
                </plugin>  
            </plugins>  
        </pluginManagement>  
    </build>  
</project>  
Java代码  
<?xml version="1.0" encoding="UTF-8"?>  
<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.juvenxu.mvnbook.account</groupId>  
    <artifactId>account-parent</artifactId>  
    <version>1.0.0-SNAPSHOT</version>  
    <packaging>pom</packaging>  
    <name>Maven Account-Parent Project</name>  
  
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
        <module>account-captcha</module>  
        <module>account-service</module>  
        <module>account-web</module>  
    </modules>  
  
    <!-- Maven属性 -->  
    <properties>  
        <project.build.sourceEncoding>  
            UTF-8  
        </project.build.sourceEncoding>  
        <project.reporting.outputEncoding>  
            UTF-8  
        </project.reporting.outputEncoding>  
        <project.version>1.0.0-SNAPSHOT</project.version>  
        <springframework.version>2.5.6</springframework.version>  
        <junit.version>4.10</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>  
                <!-- 支持java 5 -->  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-compiler-plugin</artifactId>  
                    <version>2.3.2</version>  
                    <configuration>  
                        <source>1.5</source>  
                        <target>1.5</target>  
                    </configuration>  
                </plugin>  
                <!-- 使用UTF-8编码处理资源文件 -->  
                <plugin>  
                    <groupId>org.apache.maven.plugins</groupId>  
                    <artifactId>maven-resources-plugin</artifactId>  
                    <version>2.5</version>  
                    <configuration>  
                        <encoding>UTF-8</encoding>  
                    </configuration>  
                </plugin>  
            </plugins>  
        </pluginManagement>  
    </build>  
</project>  
 相应子模块的POM配置也做微小修改,本来父模块与子模块位于同级目录,现在新的account-parent在上一层目录 ,这是Maven默认能识别的父模块位置,因此无须再配置relativePath,如:
Java代码  
。。。  
    <parent>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-parent</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
    </parent>  
。。。  
Java代码  
。。。  
    <parent>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-parent</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
    </parent>  
。。。  
 
 
约定优于配置
 约定优于配置,Maven核心设计理念之一
使用约定可以大量减少配置
超级POM
Maven3:%M2_HOME%/lib/maven-model-builder-x.x.x.jar中
org/apache/maven/model/pom-4.0.0.xml
Maven2:%M2_HOME%/lib/maven-x.x.x-uber.jar中
org/apache/maven/project/pom-4.0.0.xml
任何一个Maven项目都隐式地继承自超级POM
大量超级POM的配置都会被 所有Maven继承,这些配置也就成为了Maven所提倡的约定
 
反应堆
在一个多模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构。
对于单模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。
反应堆的构建顺序
Maven按序读取POM,如果该POM没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。
类似于递归
裁减反应堆
需求:
用户会选择构建整个项目或者选择构建单个模块,但有时,用户仅需构建完整反应堆中的某些个模块,换句话说,用户需要实时地裁减反应堆
命令:
-am, --also-make:同时构建所列模块的依赖模块
-amd, -also-make-dependents:同时构建依赖于所列模块的模块
-pl, --projects <arg>:构建指定的模块,模块间用逗号分隔
-rf, -resume-from <arg>:从指定的模块回复反应堆
 
 
Java代码  
mvn clean install  
Java代码  
mvn clean install  
得到完整反应堆 
 
 
Java代码  
mvn clean install -pl account-email,account-persist  
Java代码  
mvn clean install -pl account-email,account-persist  
 指定构建某几个模块
 
 
Java代码  
mvn clean install -pl account-email -am  
Java代码  
mvn clean install -pl account-email -am  
 同时构建所列模块的依赖模块
 
 
Java代码  
mvn clean install -pl account-parent -amd  
Java代码  
mvn clean install -pl account-parent -amd  
 同时构建依赖于所列模块的模块
 
Java代码  
mvn clean install -rf account-email  
Java代码  
mvn clean install -rf account-email  
 可以在完整的反应堆构建顺序基础上指定从哪个模块开始构建
 
 
Java代码  
mvn clean install -pl account-parent -amd -rf account-email  
Java代码  
mvn clean install -pl account-parent -amd -rf account-email  
 对裁剪后的反应堆再次裁剪
 
 
*************************************************************************

转载地址:http://gofdx.baihongyu.com/

你可能感兴趣的文章
Java基础之String,StringBuilder,StringBuffer
查看>>
1月9日学习内容整理:爬虫基本原理
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
渐变色文字
查看>>
C++ 0X 新特性实例(比较常用的) (转)
查看>>
node生成自定义命令(yargs/commander)
查看>>
各种非算法模板
查看>>
node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
查看>>
如何创建Servlet
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
BZOJ1997:[HNOI2010]PLANAR——题解
查看>>
BZOJ1014:[JSOI2008]火星人prefix——题解
查看>>
使用Unity3D引擎开发赛车游戏
查看>>
HTML5新手入门指南
查看>>
opennebula 开发记录
查看>>
ubuntu 修改hostname
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>