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

聚合与继承的关系

聚合是为了方便快速构建项目,继承是为了消除重复配置

共同点是两者的packaging都是pom,聚合模块与继承关系中的父模块除了pom之外都没有实际内容。

聚合关系与继承关系的比较:

在现有实际项目中,往往发现一个pom既是聚合pom又是父pom,这么做主要是为了方便。一般来说,融合使用聚合和继承没有什么问题。例如,可以将account-aggregator和account-parent合并成为一个新的account-parent,如下:

<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>
<modules>
    <module>account-email<module>
    <module>account-persist</module>
</modules>
<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>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<build>
    <pluginManagement>
        <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>
        </plugins>
    </pluginManagement>
</build>

相应的account-email和account-persist的pom配置也要做微小的修改。本来account-parent和他们位于同级目录,因此需要使用值为../account-parent/pom.xml的relativePath元素。现在新的account-parent在上一层目录,这是Maven默认能识别的父模块位置,因此不再需要配置relativePath,如下:

<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>

约定优于配置

Java成功的重要原因之一就是他能够屏蔽大部分操作系统的差异,XML流行的原因之一是所有语言都接受他。Maven提倡约定优于配置,这是Maven最核心的设计理念之一。

使用约定可以大量减少配置,先看一个简单的Ant配置文件:

<project name="my-project" default="dist" basedir=".">
    <description>
        simple example build file
    </dedication>
    <!-- 设置构建的全局属性 -->
    <property name="src" location="src/main/java" />
    <property name="build" location="target/classes" />
    <property name="dist" location="target" />

    <target name="init" >
        <!-- 创建时间戳 -->
        <tstamp/>
        <!-- 创建编译使用的构建目录 -->
        <mkdir dir="${build}" />
    </target>
    <target name="compile" depends="init" description="compile the source" >
        <!-- 将Java代码从目录${src}编译至${build} -->
        <javac srcdir="${src}" destdir="${build}" />
    </target>
    <target name="dist" depends="compile" description="generate the distribution">
        <!-- 创建分发目录 -->
        <mkdir dir="${dist}/lib/" />
        <!-- 将${build}目录的所有内容打包至MyProject-${DSTAMP}.jar file -->
        <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}" />
    </target>
    <target name="clean" description="clean up" >
        <!-- 删除${bulid}和${dist}目录树 -->
        <delete dir="${build}" />
        <delete dir="${dist}" />
    </target>
</project>

这段代码做的事情就是清除构建目录、创建目录,编译代码、复制依赖至目标目录、最后打包,做同样的使用Maven需要什么配置呢?maven只需要一个最简单的pom,如下:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0</version>
</project>

但是为了获得这样简洁的配置,用户是需要付出一定的代价的,那就是遵循Maven的约定,Maven会假设用户的项目是这样的:

编译输出目录为:target/classes

打包方式为:jar

包输出目录为:target/

当然你也可以自己定义,个性往往意味着牺牲通用性,意味着增加无谓的复杂度,例如:Maven允许你自定义源码目录

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0</version>
    <build>
        <sourceDirectory>src/java</sourceDirectory>
    </build>
</project>

该例中源码目录变成了src/java而不是默认的src/main/java,这就很容易出现问题了。

反应堆

在一个多模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构。对于单模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。

首先我们来看下反应堆的构建顺序

以account-aggregator为例:

<modules>
    <module>account-email</module>
    <module>account-persist</module>
    <module>account-parent</module>
</modules>

该例中,account-aggregator没有依赖模块,因此先构建他,接着account-email,他依赖于account-parent模块,必须先构建account-parent,然后在构建account-email,最后到account-persist的时候由于其依赖的模块已经构建,因此直接构建。

裁剪反应堆

一般来说用户会选择构建整个项目或者选择构建单个模块,但是有些时候,用户会想要构建完整的反应堆中的某些模块。换句话说用户需要实时的裁剪反应堆,输入mvn -h可以看到

-am –also - make 同时构建所列模块的依赖模块 mvn clean install -pl account-email -am,account-email依赖于account-parent所以:

account parent

account eamil

-amd –also make dependents 同时构建依赖于所列模块的模块

mvn clean install -pl account-parent -amd,account-email和account-persist都依赖于account-parent所以:

account parent

account email

account persist

-pl –projects 构建指定的模块,模块之间用逗号分隔,例如:mvn clean install -pl account-email,account-persist

account eamil

account persist

-rf –resume-from 从指定的模块回复反应堆

mvn clean install -rf account-email,完整的反应堆构建顺序中,account-email第三,他之后只有account-persist

account email

account persist

在-pl -am或者-pl -amd的基础上还能应用-rf

mvn clean install -pl account-parent -amd -rf account-email

该命令中-pl和-amd参数会裁剪出一个account-parent,account-email,account-persist,在此基础上-rf从account-email构建

account email

account persist

时间: 2024-08-05 13:04:35

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

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&

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的聚合与继承5

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

Maven之 聚合与继承 详解

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

Maven真——聚合和继承(于)

依赖管理 我们谈论继承一个dependencies因素,我们非常easy这个特性被认为是适用于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中聚合与继承

何为继承? --?继承为了消除重复,我们把很多相同的配置提取出来 --?例如: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/