DLancerC

Maven 学习笔记(六)

Maven 模块直接存在类似 Java 语言的聚合与继承关系. 通过依赖和插件管理的可以更好的简化 Maven 的配置.并且通过这两个特性编写出更新简洁完善的 Maven 测试案例.

聚合与继承

聚合

通过创建一个新的聚合模块, 可用通过该模块构建整个项目的所有模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.dlc.maven</groupId>
<artifactId>dlc-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>DLC-PARENT</name>
<!-- 父子结构 -->
<modules>
<module>dlc-module-1</module>
<module>dlc-module-2</module>
</modules>
<!-- 平行结构 -->
<modules>
<module>../dlc-module-1</module>
<module>../dlc-module-2</module>
</modules>
</project>

继承

  1. 作为父模块的POM, 必须 packaging 必须定义为 pom

  2. 继承父模块的子模块POM

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <project>
    <!-- 声明父模块 -->
    <parent>
    <groupId>com.dlc.maven</groupId>
    <artifactId>dlc-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <!--
    非必须 父模块 POM 的相对路径
    relativePath 默认值是 ../pom.xml
    -->
    <relativePath></relativePath>
    </parent>
    <artifactId>dlc-subModule</artifactId>
    <name>SubModule</name>
    <dependencies>
    ...
    </dependencies>
    <build>
    <plugins>
    ...
    </plugins>
    </build>
    </project>
  3. 可继承的 POM 元素

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

依赖和插件管理

1
2
3
4
5
6
7
8
9
<!--
不会给当前模块引入依赖, 也不会跟子模块添加
但当前配置会被继承
-->
<dependencyManagement>
<dependency>
...
</dependency>
</dependencyManagement>

子 POM 可以从父 POM 中继承 dependencyManagement, 子 POM 配置的依赖如果是属于父类的 dependencyManagement, 由于继承的关系, 在子 POM 中引用可以直接省略 version 和 scope.

插件管理 pluginManagement, 原理同上.

1
2
3
4
5
6
7
8
9
<build>
<pluginManagement>
<plugins>
<plugin>
...
</plugin>
</plugins>
</pluginManagement>
</build>

反应堆

在一个多模块的Maven项目中, 反应堆 (Reactor) 是指所有模块的一个构建结构. 对于单模块的项目, Reactor就是该模块本身, 但对于多模块的项目, 反应堆包含了各个模块直接的继承与依赖关系, 从而 Maven 可以自动计算出合理的模块构建顺序.

一个 Reactor的构建顺序为: Maven 按顺序读取 POM, 如果该 POM 没有依赖模块, 那么就构建该模块, 否则就会先构建该模块的, 如果该模块还依赖其他模块,则先构建该模块.

如果值需要构建项目中的一个模块, 可以通过裁剪 Reactor 来实现
1
2
3
4
5
6
7
8
# 同时构建所列模块的依赖模块: -am, --also-make
mvn clean install -pl dlc-module-1 -am
# 同时构建依赖于所列模块的模块: -amd, -also-make-dependents
mvn clean install -pl dlc-module-1 -amd
# 构建指定的模块, 模块参数用逗号分隔: -pl, --projects <arg>
mvn clean install -pl dlc-module-1,dlc-module-2
# 从指定的模块回复 Reactor: -rf, -resume-from <arg>
mvn clean install -rf dlc-module-1

Maven测试

maven-surefire-plugin

此插件是与 default生命周期的 test阶段绑定的, 是Maven内置绑定.
maven-surefire-plugin会自动执行 Maven 测试路径(默认 src/test/java/)下的所有符合以下一组命名模式的测试类. 模式为:

  • **/Test*.java
  • **/*Test.java
  • **/*TestCase.java

跳过测试

1
2
3
4
# 跳过 default生命周期的 test 阶段, 但是仍会 test 编译, tetst 创建等阶段
mvn clean install -DskipTests
# 会跳过所有与 test 有关的阶段.
mvn clean install -Dmaven.skip.test=true

OR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- -Dmaven.skip.test=true ,此 skip 参数只针对 test -->
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<!-- -Dmaven.skip.test=true -->
<skip>true</skip>
<!-- -DskipTests -->
<skipTests>true</skipTests>
</configuration>
</plugin>

动态指定运行的测试用例

1
2
3
4
5
6
mvn test -Dtest=className
mvn test -Dtest=className*Test
mvn test -Dtest=className1,className2
mvn test -Dtest=className*Test,className2
# 默认 -Dtest 如果没有找到测试类, Maven 会默认报错, 添加参数 DfailIfNoTests 没有测试也不报错
mvn test -Dtest -DfailIfNoTests=false

包含与排除测试用例

1
2
3
4
5
6
7
8
9
10
11
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<!-- 任意路径(**)以 Tests 结尾(*)的 Java 类包含在测试中 -->
<include>**/*Tests.java</include>
<!-- 任意路径(**)的 Test.java 类排除出测试-->
<exclude>**/Test.java</exclude>
</configuration>
</plugin>

测试报告

  1. 基本测试报告

    默认情况下, maven-surefire-plugin 会在项目的 target/surefire-reports 目录下生成两种格式的错误报告:

    • 简单文本格式
    • 与JUnit 兼容的XML格式
  2. 测试覆盖率报告
    使用 Cobertura, Maven 通过 cobertura-maven-plugin 与之集成.

    1
    mvn cobertura:cobertura

    会在项目目录 target/site/cobertrua/生成HTML格式的报告.