Maven实战——聚合与继承(上)

聚合

首先我们来看两个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:包括项目的报告输出目录配置、报告插件配置

时间: 2024-12-24 10:01:52

Maven实战——聚合与继承(上)的相关文章

Maven实战——聚合与继承(下)

聚合与继承的关系 聚合是为了方便快速构建项目,继承是为了消除重复配置 共同点是两者的packaging都是pom,聚合模块与继承关系中的父模块除了pom之外都没有实际内容. 聚合关系与继承关系的比较: 在现有实际项目中,往往发现一个pom既是聚合pom又是父pom,这么做主要是为了方便.一般来说,融合使用聚合和继承没有什么问题.例如,可以将account-aggregator和account-parent合并成为一个新的account-parent,如下: <modelVersion>4.0.

Maven实战——聚合与继承(中)

依赖管理 上一节我们说到可以继承dependencies元素,我们很容易想到把这一特性应用到accout-parent中.子模块account-email和account-persist同时依赖了org.springframework:spring-core:2.5.6,spring-beans:2.5.6,spring-context:2.5.6,junit:junit:4.7.以此可以将这些公共依赖放到父模块account-parent中,两个子模块就能移除这些依赖,简化配置. 上述方法时可

Maven之——聚合与继承

Maven之--聚合与继承 1.    聚合 所谓聚合就是用一个pom.xml配置文件将一个或者多个项目关联起来.这样当我们执行聚合文件pom.xml的生命周期阶段的时候.他就会执行在聚合文件中指定聚合的所有项目的对应生命周期阶段. 包含聚合文件的是一个额外的模块.这个模块必须要有自己的POM文件.并切此聚合项目的POM的packaging必须是pom: <modelVersion>4.0.0</modelVersion> <groupId>org.andy.items

Maven学习笔记(三):Maven的聚合和继承

Maven的聚合其实就是把各个项目拷贝到一个项目里,便于统一构建(这种是父子目录结构构件,个人喜欢这种,平行结构不喜欢),实现聚合的方式为: -- 新建一个普通的Maven项目,只保留pom文件,其他的目录结构都删除 -- 配置新建项目的pom文件: 1 <project ...> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>XXXX</groupId> 4 <artifactId>

Maven之 聚合与继承 详解

说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构.分模块开发,来提高代码的清晰和重用.针对于这一特性,maven也给予了相应的配置. 情景分析一: 我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可

maven的聚合与继承5

一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module> 3 <module>模块二</module> 4 <module>模块三</module> 5 </modules> 例如:对项目的Hello.HelloFriend.MakeFriends这三个模块进行聚合 1 <modules>

Maven中聚合与继承

何为继承? --?继承为了消除重复,我们把很多相同的配置提取出来 --?例如:grouptId,version等 就像写java程序一样,对于有共性切重复的东西,就提取出来. 如有三个pom.xml配置文件, Hello/pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sche

Maven模块聚合与继承

聚合 假如有account-email和account-persist两个模块,我们想要一次构建这两个项目,这时需要用到聚合. 聚合模块 package值必须为pom 必须有元素modules module值为相对目录名 新建account-aggregator模块,下面有如下pom文件,其它两个模块保持不变. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/

maven的聚合与继承

新建一个空的maven项目user-parent Pom.xml内容 <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