`

maven日记(五):聚合与继承

阅读更多

maven的聚合特性能够把项目的各个模块聚合在一起构建,而maven的集成特性则能够帮助抽取各个模块相同的依赖和插件等配置,在简化POM的同时,还能够促进各个模块配置的一致性。

>> 聚合的例子:

<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/maven-v4_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-parent</module>
    </modules>
</project>

下面是截图:


 

上述POM依旧使用账户注册服务共同的groupId:com.juvenxu.mvnbook.account,artifactId为独立的account-aggregator,版本也与其他两个模块一致。这里有个特殊的地方就是packaging为pom,对于聚合模块来说,打包方式必须为packaging为pom,否则无法构建。

POM的modules元素指定任意数量的module来实现模块的聚合,这里每个model的值都是一个相对于当前POM的相对目录,注意,为了方便快速定位,模块所处的目录名称应该与其artifactId一致,不过这个不是必须的,用户可以将account-emails项目放到email-account/目录下,这时候。module的值为email-account了。

一般都会把聚合模块放在顶层,然后子模块放到聚合模块POM目录的子目录下,这样便于查找,就像上面的那样,不过你也可以平行放置,这时候,聚合模块的POM配置就要改了:

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

这样够清楚了吧。

在聚合模块上运行mvn clean install,会先解析聚合模块的POM、分析要构建的模块,并计算出一个反应堆构建顺序(Reactor Build Order),然后根据这个顺序依次构建各个模块。反应堆是所有模块组成的一个构建结构。从构建的输出来看,显示的是各个模块的名称(也就是POM定义中的name的值),而不是artifactiId,所以你定义POM的时候一定要写好name。

>> 继承的例子:

仔细观察可以发现account-email跟account-persist模块有很多重复的配置,比如groupId,version,dependency,plugin等等。可以定义个account-parent模块,定义它们的公共属性,然后让这两个模块继承自account-parent父模块:

<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/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>
    <name>Account Parent</name>
    <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>
            ...
        </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>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

然后下面是account-email定义:

<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/maven-v4_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-persist</artifactId>
    <name>Account Persist</name>
 
    <properties>
        <dom4j.version>1.6.1</dom4j.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>${dom4j.version}</version>
        </dependency>
        ...
    </dependencies>
 
    <build>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
            </testResource>
        </testResources>
    </build>
</project>

下面列出在maven中可以被继承的POM元素:

* groupId:项目组ID,项目坐标的核心元素

* version:项目版本,项目坐标的核心元素

* description:项目的描述信息

* organization:项目的组织信息

* inceptionYear:项目的创始年份

* url:项目的URL地址

* developers:项目的开发者信息

* contributors:项目的贡献者信息

* distributionManagement:项目的部署信息

* issueManagement:项目的缺陷跟踪系统信息

* ciManagement:项目的持续集成系统信息

* scm:项目的版本控制系统信息

* mailingLists:项目的邮件列表信息

* properties:自定义的Maven属性

* dependencies:项目的依赖配置

* dependencyManagement:项目的依赖管理配置

* repositories:项目的仓库配置

* build:包括项目的源码输出目录配置、输出目录配置、插件配置、插件管理配置等

* reporting:包括项目的报告输出目录配置、报告插件配置等

现在是时候来解释下父pom.xml文件中定义的dependencyManagement的含义了:Maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能约束dependencies下的依赖使用,例如可用在dependencyManagement配置这个:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${springframework.version}</version>
</dependency>

而在子pom.xml中只需要groupId和artifactId即可引入正确的依赖包,这样做可用消除各个子模块引入jar包的版本不一致的问题,还有如果是junit的test的scope依赖,也会被继承下来,也就是说子模块中只要groupId和artifactId即可了。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
</dependency>

还有个import依赖范围比较特殊,这个东东只有在dependencyManagement元素下才有用,使用该范围的依赖通常指向一个POM,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中。除了复制和继承,还可以用import。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.juven...</groupId>
                <artifactId>account-parent</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

注意上面的type为pom,import范围依赖由于其特殊性,一般都指向打包类型为pom的模块。

>> 插件管理pluginManagement:

类似于dependencyManagement元素管理依赖,maven提供了pluginManagement管理插件,也就是说该元素中配置的依赖不会造成实际的插件调用行为,但pom中配置真正的plugin元素的时候,并且其groupId和artifactId与pluginManagement中配置的插件匹配的时候,才会影响实际的插件行为。这个元素基本都是在父POM中定义,然后子模块去继承就可以了。

>> 反应堆的构建顺序:

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

实际的构建顺序是这样的:Maven按顺序读取POM,如果该POM没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖还有其他依赖,则进一步先构建其他依赖。

>> 裁剪反应堆:

maven提供很多命令支持裁剪反应堆,输入mvn -h查看选项:

* -am或者–also-make:同时构建所列模块的依赖模块

* -amd或者-also-make-dependents:同时构建依赖于所列模块的模块

* -pl或者–projects <args> 构建指定模块,模块间用逗号隔开

* -rf或 -resume-from <args> 从指定的模块开始构建反应堆

# mvn clean install -pl account-email,account-persist

# mvn clean install -pl account-email -am

# mvn clean install -pl account-parent -amd

# mvn clean install -rf account-email

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

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

  • 大小: 84.6 KB
分享到:
评论

相关推荐

    Maven更新失败,Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.1

    Maven更新问题 今天Maven在更新的时候发现一直更新不成功,总结下解决方法。 在apache-maven-3.5.2/conf/setting.xml中加入以下配置即可解决 alimaven aliyun maven ...

    maven聚合与继承配置

    本示例将深入探讨"Maven聚合与继承"的概念。 **一、Maven聚合(Aggregation)** Maven聚合允许我们将多个独立的Maven项目组织在一起,形成一个单一的构建单元。在我们的示例中,`parent`项目就是一个聚合项目。它...

    maven继承与聚合代码

    本篇文章将深入探讨Maven的两个重要特性:继承(Inheritance)和聚合(Aggregation),并结合提供的资源《一头扎进Maven3》第五讲源码及文档进行详细解释。 **一、Maven继承** Maven的继承机制允许我们在多个项目...

    maven依赖+继承+聚合

    本示例将深入探讨Maven中的“依赖”、“继承”和“聚合”这三个核心概念,帮助开发者更好地理解和应用Maven。 首先,我们来讨论"Maven依赖"。在Java开发中,一个项目往往需要引用其他库或者框架来完成特定功能。...

    Failed to execute goal org.apache.maven.plugins:maven-compiler

    在&lt;plugins&gt;&lt;/plugins&gt;中添加 &lt;groupId&gt;org.apache.maven.plugins &lt;artifactId&gt;maven-compiler-plugin &lt;version&gt;3.8.1 &lt;source&gt;1.8 &lt;target&gt;1.8 &lt;/plugin&gt;

    Jenkins编译报错Failed to execute goal org.apache.maven.plugins_maven-clean-plugin

    Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project

    Maven报错: Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources

    idea创建Maven项目时,报错显示Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources,并且Maven插件内看不到 mybatis-generator。如下图: 折腾了好久发现配置放错地方了,...

    maven 依赖,聚合,继承,插件运行应用

    在"Maven 依赖,聚合,继承,插件运行应用"这个主题中,我们将深入探讨这四个核心概念。 1. **依赖管理**:Maven依赖是项目中各个模块之间共享代码的关键机制。当你在POM.xml文件中声明一个依赖,Maven会自动下载并...

    maven聚合和继承

    在Maven中,"聚合"和"继承"是两个重要的特性,它们有助于管理和组织大型的多模块项目。 **一、Maven聚合** Maven聚合(Aggregation)是用来管理多个相关项目的方式,这些项目可能共享一部分代码或者有共同的构建...

    Maven使用tomcat8-maven-plugin插件.docx

    Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-plugin 来实现 Maven 项目与 Tomcat 服务器的集成。下面我们将详细介绍如何使用 tomcat8-maven-plugin 插件。 tomcat8-maven-plugin 插件的...

    maven 配置文件:settings.xml详解版,只需修改本地仓库路径即可使用

    使用eclipse整合maven时所需要使用的配置文件;只需修改文件中的本地仓库路径即可完成整合,java初学者必选。

    Maven的聚合与继承DEMO(以及前后端分离)

    在本文中,我们将深入探讨 Maven 的聚合与继承特性,并结合前后端分离的实践,来创建一个高效的开发环境。Maven 是 Java 开发中广泛使用的构建工具,它通过配置管理依赖关系,简化项目的构建、测试和部署过程。让...

    Maven聚合与继承实例详解.docx

    本文将深入探讨Maven的聚合与继承特性,并通过实例进行详细解释。 首先,Maven的依赖管理系统允许开发者声明项目所需的库和它们的版本,从而避免了版本冲突和手动管理jar包的问题。在Maven的POM(Project Object ...

    Maven全攻略:下载、安装、配置与使用一应俱全.zip

    1. Maven插件与工具:介绍一些常用的Maven插件和工具,如Maven Helper、Maven Dependency Plugin等,它们可以帮助开发者更加高效地管理项目依赖和构建流程。 2. Maven实战教程:提供一系列Maven实战教程,包括如何...

    Maven安装与配置:Windows和Linux环境下的步骤

    Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置...

    version-maven-plugin:简单易用的maven继承聚合项目的版本号变更插件

    用于对Maven聚合继承项目的版本号进行便捷变更的工具 在使用RPC框架的微服务架构中,为了让服务消费者实现像调用本地方法一样的透明的通过网络进行RPC,服务提供者一般会提供立面jar用于服务消费者集成并通过动态...

    Apache.Maven.Cookbook.1785286129

    Over 90 hands-on recipes to successfully build and automate development life cycle tasks following Maven conventions and best practices About This Book Understand the features of Apache Maven that ...

    Maven的安装包:apache-maven-3.6.1-zip

    **Apache Maven 3.6.1 安装与使用指南** Apache Maven 是一个强大的Java项目管理工具,它基于项目对象模型(Project Object Model, POM)的概念,能够自动化构建、依赖管理和项目信息管理。Maven 的核心理念是通过...

    tomcat8-maven-plugin-3.0-r1655215.jar

    解决tomcat8-maven-plugin-3.0-r1655215.jar阿里云同有的问题。放到路径org\apache\tomcat\maven\tomcat8-maven-plugin\3.0-r1655215\就可以了

Global site tag (gtag.js) - Google Analytics