Maven学习总结系列七:聚合与继承

在实际开发中,为了得到更清晰的设计及更高的重用性,我们往往会采用各种方式对软件划分模块。

遇到一些问题:

比如:我们需要对每一个模块分别进行构建,非常浪费我们的时间。每个模块的JAR包版本的统一管理变成有点困难。

Maven方案:

Maven使用了聚合特性,把项目的各个模块聚合在一起,一次性构建所有模块。 通过”继承特性“则帮助抽取各模块相同的依赖和插件等有共性的配置,在简化POM的同时,还能促进各个模块配置的一致性。

1.1 聚合

场景假设:

你有一个项目,包含两个模块

account-email

Account-persist

有一个简单的需求,你想一次构建两个项目,而不是两个模块目录下分别执行mvn命令。

使用maven的聚合方案:

创建一个聚合模块,account-aggregator,

聚合模块特点:

1.本身也是一个maven项目

2.必须要有自己的POM,但packaging的值为POM,而像accout-email为JAR或不声明(默认为jar)

3.声明需要聚合的模块module,每一个module的值都是一个当前POM的相对目录。

maven中的两种结构:

1)父子目录结构关系:聚合模块是被聚合模块父文件夹

配置方式:<module>account-email</module>

                     <module>account-persist</module>

2)平行目录结构:聚合模块是被聚合模块是平级的文件夹(我通常使用该方式)

配置方式:<module>../account-email</module>

                     <module>../account-persist</module>

 

4.聚合模块只包含一个pom.xml文件,不需要src/main/java,src/test/java等目录,原因是聚合模块仅仅是帮助聚合其它模块构建的工具,它本身并无实质内容的。

聚合模块POM配置如下:

Pom.xml

-----------------------------------------------------------------------------------

<projectxmlns="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.0http://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>AccountAggregator</name>

<modules>

<module>../account-email</module>

<module>../account-persist</module>

</modules>

</project>

-----------------------------------------------------------------------------------

Delete the unnecessary item.

 

Note:Just only keep the pom.xml file in account-aggregator project.

聚合模块执行原理:

Maven会首先解析聚合模块的POM,分析要构建的模块,并计算出一个反应堆构建顺序(Reactor Build Order),然后根据这个顺序依次建各个模块。

我们执行install命令,观察其执行情况.

mvn install

[INFO] Scanning forprojects...

[INFO]------------------------------------------------------------------------

[INFO] Reactor BuildOrder:

[INFO]

[INFO] Account Email

[INFO] AccountPersist

[INFO] AccountAggregator

[INFO]                                                                        

[INFO]------------------------------------------------------------------------

[INFO] BuildingAccount Email 1.0.0-SNAPSHOT

[INFO]------------------------------------------------------------------------

[INFO]

[INFO] ---maven-resources-plugin:2.6:resources (default-resources) @ account-email ---

[INFO] Using 'UTF-8'encoding to copy filtered resources.

[INFO] Copying 1resource

[INFO]

[INFO] ---maven-compiler-plugin:3.1:compile (default-compile) @ account-email ---

[INFO] Nothing tocompile - all classes are up to date

[INFO]

[INFO] ---maven-resources-plugin:2.6:testResources (default-testResources) @account-email ---

[INFO] Using 'UTF-8'encoding to copy filtered resources.

[INFO] Copying 1resource

[INFO]

[INFO] ---maven-compiler-plugin:3.1:testCompile (default-testCompile) @ account-email ---

[INFO] Nothing tocompile - all classes are up to date

[INFO]

[INFO] ---maven-surefire-plugin:2.12.4:test (default-test) @ account-email ---

[INFO] Surefirereport directory:D:\Workspaces\eclipse-jee-oxygen_x86_64\account-email\target\surefire-reports

-------------------------------------------------------

 T E S T S

-------------------------------------------------------

Runningcom.juvenxu.mvnbook.account.email.AccountEmailServiceTest

Test Subject

<h3>Test</h3>

Tests run: 1,Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.707 sec

Results :

Tests run: 1,Failures: 0, Errors: 0, Skipped: 0

[INFO]

[INFO] ---maven-jar-plugin:2.4:jar (default-jar) @ account-email ---

[INFO] Building jar:D:\Workspaces\eclipse-jee-oxygen_x86_64\account-email\target\account-email-1.0.0-SNAPSHOT.jar

[INFO]

[INFO] ---maven-install-plugin:2.4:install (default-install) @ account-email ---

[INFO] InstallingD:\Workspaces\eclipse-jee-oxygen_x86_64\account-email\target\account-email-1.0.0-SNAPSHOT.jarto D:\Workspaces\maven_repository\com\juven\mvnbook\account\account-email\1.0.0-SNAPSHOT\account-email-1.0.0-SNAPSHOT.jar

[INFO] InstallingD:\Workspaces\eclipse-jee-oxygen_x86_64\account-email\pom.xml toD:\Workspaces\maven_repository\com\juven\mvnbook\account\account-email\1.0.0-SNAPSHOT\account-email-1.0.0-SNAPSHOT.pom

[INFO]                                                                        

[INFO]------------------------------------------------------------------------

[INFO] BuildingAccount Persist 1.0.0-SNAPSHOT

[INFO]------------------------------------------------------------------------

[INFO]

[INFO] ---maven-resources-plugin:2.6:resources (default-resources) @ account-persist ---

[INFO] Using 'UTF-8'encoding to copy filtered resources.

[INFO] Copying 1resource

[INFO]

[INFO] ---maven-compiler-plugin:3.1:compile (default-compile) @ account-persist ---

[INFO] Nothing tocompile - all classes are up to date

[INFO]

[INFO] ---maven-resources-plugin:2.6:testResources (default-testResources) @account-persist ---

[INFO] Using 'UTF-8'encoding to copy filtered resources.

[INFO] Copying 1resource

[INFO]

[INFO] ---maven-compiler-plugin:3.1:testCompile (default-testCompile) @ account-persist---

[INFO] Nothing tocompile - all classes are up to date

[INFO]

[INFO] ---maven-surefire-plugin:2.12.4:test (default-test) @ account-persist ---

[INFO] Surefirereport directory:D:\Workspaces\eclipse-jee-oxygen_x86_64\account-persist\target\surefire-reports

-------------------------------------------------------

 T E S T S

-------------------------------------------------------

Runningcom.juvenxu.mvnbook.account.persist.AccountPersistServiceTest

Results :

Tests run: 4,Failures: 0, Errors: 0, Skipped: 0

[INFO]

[INFO] ---maven-jar-plugin:2.4:jar (default-jar) @ account-persist ---

[INFO] Building jar:D:\Workspaces\eclipse-jee-oxygen_x86_64\account-persist\target\account-persist-1.0.0-SNAPSHOT.jar

[INFO]

[INFO] ---maven-install-plugin:2.4:install (default-install) @ account-persist ---

[INFO] InstallingD:\Workspaces\eclipse-jee-oxygen_x86_64\account-persist\target\account-persist-1.0.0-SNAPSHOT.jartoD:\Workspaces\maven_repository\com\juvenxu\mvnbook\account\account-persist\1.0.0-SNAPSHOT\account-persist-1.0.0-SNAPSHOT.jar

[INFO] InstallingD:\Workspaces\eclipse-jee-oxygen_x86_64\account-persist\pom.xml toD:\Workspaces\maven_repository\com\juvenxu\mvnbook\account\account-persist\1.0.0-SNAPSHOT\account-persist-1.0.0-SNAPSHOT.pom

[INFO]                                                                        

[INFO]------------------------------------------------------------------------

[INFO] BuildingAccount Aggregator 1.0.0-SNAPSHOT

[INFO]------------------------------------------------------------------------

[INFO]

[INFO] ---maven-install-plugin:2.4:install (default-install) @ account-aggregator ---

[INFO] InstallingD:\Workspaces\eclipse-jee-oxygen_x86_64\account-aggregator\pom.xml toD:\Workspaces\maven_repository\com\juvenxu\mvnbook\account\account-aggregator\1.0.0-SNAPSHOT\account-aggregator-1.0.0-SNAPSHOT.pom

[INFO]------------------------------------------------------------------------

[INFO] ReactorSummary:

[INFO]

[INFO]Account Email ...................................... SUCCESS [  2.712 s]

[INFO]Account Persist .................................... SUCCESS [  0.709 s]

[INFO]Account Aggregator ................................. SUCCESS [  0.015 s]

[INFO]------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO]------------------------------------------------------------------------

[INFO] Total time:3.520 s

[INFO] Finished at:2017-11-02T22:30:02+08:00

[INFO] Final Memory:10M/243M

[INFO]------------------------------------------------------------------------

1.3 继承

继承对于JAVA开发者来说,是一个非常熟悉的概念了。是的,Maven同样有相同的特性。

开发中的问题1:在Maven的pom.xml配置中,我们发现,他们有相同的配置,如:有相同的groupId和version,相同的依赖,spring-core,spring-beans等,相同的插件,如maven-compiler-plugin,maven-resources-plugin等配置。

这意味着,每一个模块都有重复,有没有办法减少这种重复呢?

Maven的方案:引入继承的概念,创建一个父模块,将多个模块的共同配置抽离出来,这父模块中声明,实现“一处声明,多处使用”的目的。

父模块特点:

1.本身也是一个maven项目

2.必须要有自己的POM,但packaging的值为POM,而像accout-email为JAR或不声明(默认为jar)

3.父模块只包含一个pom.xml文件,不需要src/main/java,src/test/java等目录,原因是父模块仅仅是帮助消除配置的重复。

4.需要在子模块中声明继承哪个父模块(通过父模块的坐标指定),所以子模块知道它继承自谁,但父模块不知道谁会继承它。

<relativePath>父模块pom.xml配置时,跟聚合一样,要考虑父模块与子模块的目录关系。

例:创建一个父类account-parent

它的两个子模块为为

account-email

Account-persist

同时我们把account-parent加入到account-aggregator中聚合。

Create parent project

 

 

The pom.xml of account-parent

-----------------------------------------------------------------------------------

<projectxmlns="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>Account Parent</name>

 

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

</dependencies>

</project>

-----------------------------------------------------------------------------------

定义父模块,使用<dependencies>元素,定义了junit构件,父模块及子模块会引入声明的依赖。

 

Now, we have the parent project. Let's set thechild project to inherit it.

There aretwo project that will be set as child of account-parent:

account-email

account-persist

The first one: account-email:

Thepom.xml of account-email

-----------------------------------------------------------------------------------

<projectxmlns="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.0http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<!-- 

<groupId>com.juven.mvnbook.account</groupId>

<artifactId>account-email</artifactId>

<name>Account Email</name>

<version>1.0.0-SNAPSHOT</version>

-->

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

</project>

-----------------------------------------------------------------------------------

类继承时,我们需要指定父类的类名,而Maven的父模块继承时,我们需要指定父模块的坐标。

<relativePath>元素设置非常重要,如果设置不正确,子模块构建将会失败。

<groupId>与<version>:由于子模块没有显示声明,所以子模块隐式的从父模块继承了这两个元素。消除了一些不必的配置。

用户可以显示的声明。

 

我们没有在account-email的pom.xml中声明任何构件,但因为它继承的account-parent,而account-parent的pom.xml有配置junit构件,所以account-email自动继承的该配置,自动下载了junit-4.7.jar这个依赖到项目中。

The first second: account-persist:

Thepom.xml of account-persist

-----------------------------------------------------------------------------------

<projectxmlns="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.0http://maven.apache.org/maven-v4_0_0.xsd">

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

 -->

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

</project>

-----------------------------------------------------------------------------------

Add account-parent project to account-aggregator

Thepom.xml of account-aggregator

-----------------------------------------------------------------------------------

<projectxmlns="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.0http://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>AccountAggregator</name>

<modules>

<module>../account-parent</module>

<module>../account-email</module>

<module>../account-persist</module>

</modules>

</project>

-----------------------------------------------------------------------------------

可继承的POM元素

问题2:我们上例看到groupId和version是可以被继承的,那还有哪些POM元素是可以被继承的呢?

Maven中可继承的POM完素:

  • groupId: 项目组ID,项目坐标的核心坐标;
  • version: 项目版本,项目坐标的核心坐标;
  • description: 项目的描述信息;
  • organization: 项目的组织信息;
  • inceptionYear: 项目的创始年份;
  • url: 项目的URL地址;
  • developers: 项目的开发者信息;
  • contributors: 项目的贡献值和信息;
  • distributionManagement: 项目的部署配置;
  • issueManagement: 项目的缺陷跟踪系统;
  • ciManagement: 项目的持续集成系统信息;
  • scm: 项目的版本控制系统信息;
  • mailingLists: 项目的邮件列表信息;
  • properties: 自定义的Maven属性;
  • dependencies: 项目的依赖配置;
  • dependencyManagement: 项目的依赖管理配置;
  • repositories: 项目的仓库配置;
  • build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
  • reporting: 包括项目的报告输出目录配置、报告插件配置等。

1.3.3 依赖管理

问题:根据上面的例子,由于可继承的元素列表包含dependencies元素,说明依赖是会被继承的。所以junit依赖被继承到了子模块。

随着我们的项目越来越大,抽离的共用依赖越多,可能会出现一种情况,父类中我们定义了4个依赖,目前的子模块都需要,但有一天我们加一个account-util模块,它只需要其中一个依赖,与其它依赖无关,难道也要让它依赖其它三个无用的依赖吗?

这似乎不合道理。

Maven的解决方案:引入“依赖管理”,它在父类中通过dependencyManagement元素来声明依赖,子模块中不会自动继承dependencyManagement元素中的依赖,如果子模块需要某个父类中声明依赖,子模块需要显式的声明需要继承的依赖,但只需要声明<groupId>与<artifactId>即可,不需要其它元素。不需要的依赖则不声明即可。

这样即能让子模块继承到父模块的依赖配置,版本等,实现约束子模块依赖的使用,依赖的统一管理,又能保证子模块依赖使用的灵活性。

(一) 在account-parent中配置dependencyManagement元素

The pom.xml of account-parent

-----------------------------------------------------------------------------------

<projectxmlns="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.0http://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>AccountParent</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>

<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-parent中,依赖没有被引入。这是dependencyManagement元素与dependencies元素的不同之处。

(二) 继承了dependencyManagement的account-email POM

以下依赖父模块有配置,但我们没有引入:

spring-context

spring-context-support

以下依赖父模块没有配置,但我们有引入,属于account-email模块的特有的依赖,其它模块不使用,故不适合提取到父模块中。

mail

greenmail

-----------------------------------------------------------------------------------

<projectxmlns="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.0http://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>

</parent>

<artifactId>account-email</artifactId>

<name>AccountEmail</name>

<properties>

<javax.mail.version>1.4.1</javax.mail.version>

<greenmail.version>1.3.1b</greenmail.version>

</properties>

 

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>                

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</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>

-----------------------------------------------------------------------------------

如果不声明某个依赖,那这个依赖就不会被引入。

可以看到,没声明的依赖则没有被引入。

本模块特有的依赖已被引入。

 

建议:虽然我们可以在父模块中直接使用dependencies元素引入依赖,子模块不需要任何的配置即可继承这些依赖。

虽然dependencyManagement元素的依赖管理机制不能减少太多的POM配置,但仍强烈在所有的项目中采购这种声明方法。

原因:父POM中使用dependencyManagement声明依赖能统一项目范围中依赖的版本,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本。避免多个子模块依赖版本不一致问题,降低依赖冲突。

同时减少子模块引用不必须的依赖,可控性与灵活性并存。

1.3.4 插件管理

上例中dependencyManagement元素管理依赖,Maven则提供了pluginManagement元素来管理插件。原理及使用方式与dependencyManagement完全相同。

在该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中配置的插件相匹配时,pluginManagement的配置才会影响实际的插件行为。

(一) 在父POM中配置pluginManagement

-----------------------------------------------------------------------------------

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

-----------------------------------------------------------------------------------

(二) 在子模块中配置相应的插件

-----------------------------------------------------------------------------------

<build>
    <plugins>
        <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
        </plugin>
    </plugins>
</build>

-----------------------------------------------------------------------------------

1.4 聚合与继承的关系

不同点:

聚合:为了方便快速构建项目。

对聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。因为在聚合模块中定义被聚合的模块。

继承:为了消除重复配置。

对继承关系的父POM而言,它不知道有哪些子模块继承于它,但那些子模块都必须知道自己的父POM是什么。因为在各子模块中定义父模块是谁。

共同点:

1.本身是一个maven项目

2.必须要有自己的POM,但packaging的值为POM

3.父模块只包含一个pom.xml文件,不需要src/main/java,src/test/java等目录。

 

问题:能否把聚合模块 与 继承的父模块 合并在一起呢?

我们发现其实都不用改太多,只需要把 聚合模块 对于 被聚合的模块 定义 这个不同点,加到 继承用的父模块中就好了。其它都不用变。

例:将account-aggregator和account-parent合并成一个新的account-parent:

The newpom.xml of the account-parent

-----------------------------------------------------------------------------------

<projectxmlns="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>AccountParent</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>

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

</plugin>

</plugins>

</pluginManagement>

</build>        

</project>

-----------------------------------------------------------------------------------

1.6 反应堆(Reactor)

在一个多模块的Maven项目中,反应堆是指所有模块组成的一个构件结构。包含了各模块之间继承于依赖的关系,从而能够自动计算出合理的模块构件顺序。

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

模块间的依赖关系会将反应堆构成一个有向无环图(DAG: Directed Acyclic Graph),各个模块是该图的节点,依赖关系构成了有向边。

 

裁剪反应堆

当用户并不想构建整个项目的时候,就需要实时地裁剪反应堆。

Maven提供很多命令行支持裁剪反应堆:

    -am, --alsomake: 同时构建所列模块的依赖模块模块;

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

    -pl, --projects<arg>: 构建指定模块,模块间用逗号分割;

    -rf, -resume-from<arg>: 从指定的模块回复反应堆。

      

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

\\Output: Account Email, Account Persist

    mvn clean install -pl account-parent -amd

\\Output: Account Parent, Account Email, AccountPersist

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

\\Output: Account Email, Account Persist

mvn clean install

[INFO]------------------------------------------------------------------------

[INFO] Reactor BuildOrder:

[INFO]

[INFO] AccountParent

[INFO] Account Email

[INFO] AccountPersist

[INFO] AccountAggregator

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

[INFO] Scanning forprojects...

[ERROR][ERROR] Could not find the selected project in the reactor: account-email @

[ERROR]Could not find the selected project in the reactor: account-email -> [Help1]

[ERROR]

[ERROR] Tosee the full stack trace of the errors, re-run Maven with the -e switch.

[ERROR]Re-run Maven using the -X switch to enable full debug logging.

[ERROR]

[ERROR]For more information about the errors and possible solutions, please read thefollowing articles:

[ERROR][Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MavenExecutionException

猜你喜欢

转载自blog.csdn.net/arnolian/article/details/78837596
今日推荐