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/
相关推荐
Maven更新问题 今天Maven在更新的时候发现一直更新不成功,总结下解决方法。 在apache-maven-3.5.2/conf/setting.xml中加入以下配置即可解决 alimaven aliyun maven ...
本示例将深入探讨"Maven聚合与继承"的概念。 **一、Maven聚合(Aggregation)** Maven聚合允许我们将多个独立的Maven项目组织在一起,形成一个单一的构建单元。在我们的示例中,`parent`项目就是一个聚合项目。它...
本篇文章将深入探讨Maven的两个重要特性:继承(Inheritance)和聚合(Aggregation),并结合提供的资源《一头扎进Maven3》第五讲源码及文档进行详细解释。 **一、Maven继承** Maven的继承机制允许我们在多个项目...
本示例将深入探讨Maven中的“依赖”、“继承”和“聚合”这三个核心概念,帮助开发者更好地理解和应用Maven。 首先,我们来讨论"Maven依赖"。在Java开发中,一个项目往往需要引用其他库或者框架来完成特定功能。...
在<plugins></plugins>中添加 <groupId>org.apache.maven.plugins <artifactId>maven-compiler-plugin <version>3.8.1 <source>1.8 <target>1.8 </plugin>
Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project
idea创建Maven项目时,报错显示Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources,并且Maven插件内看不到 mybatis-generator。如下图: 折腾了好久发现配置放错地方了,...
在"Maven 依赖,聚合,继承,插件运行应用"这个主题中,我们将深入探讨这四个核心概念。 1. **依赖管理**:Maven依赖是项目中各个模块之间共享代码的关键机制。当你在POM.xml文件中声明一个依赖,Maven会自动下载并...
在Maven中,"聚合"和"继承"是两个重要的特性,它们有助于管理和组织大型的多模块项目。 **一、Maven聚合** Maven聚合(Aggregation)是用来管理多个相关项目的方式,这些项目可能共享一部分代码或者有共同的构建...
Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-plugin 来实现 Maven 项目与 Tomcat 服务器的集成。下面我们将详细介绍如何使用 tomcat8-maven-plugin 插件。 tomcat8-maven-plugin 插件的...
使用eclipse整合maven时所需要使用的配置文件;只需修改文件中的本地仓库路径即可完成整合,java初学者必选。
在本文中,我们将深入探讨 Maven 的聚合与继承特性,并结合前后端分离的实践,来创建一个高效的开发环境。Maven 是 Java 开发中广泛使用的构建工具,它通过配置管理依赖关系,简化项目的构建、测试和部署过程。让...
本文将深入探讨Maven的聚合与继承特性,并通过实例进行详细解释。 首先,Maven的依赖管理系统允许开发者声明项目所需的库和它们的版本,从而避免了版本冲突和手动管理jar包的问题。在Maven的POM(Project Object ...
1. Maven插件与工具:介绍一些常用的Maven插件和工具,如Maven Helper、Maven Dependency Plugin等,它们可以帮助开发者更加高效地管理项目依赖和构建流程。 2. Maven实战教程:提供一系列Maven实战教程,包括如何...
Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置:Windows和Linux环境下的步骤; Maven安装与配置...
用于对Maven聚合继承项目的版本号进行便捷变更的工具 在使用RPC框架的微服务架构中,为了让服务消费者实现像调用本地方法一样的透明的通过网络进行RPC,服务提供者一般会提供立面jar用于服务消费者集成并通过动态...
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 ...
**Apache Maven 3.6.1 安装与使用指南** Apache Maven 是一个强大的Java项目管理工具,它基于项目对象模型(Project Object Model, POM)的概念,能够自动化构建、依赖管理和项目信息管理。Maven 的核心理念是通过...
解决tomcat8-maven-plugin-3.0-r1655215.jar阿里云同有的问题。放到路径org\apache\tomcat\maven\tomcat8-maven-plugin\3.0-r1655215\就可以了