
# Maven构建
Maven主要用于基于Java的项目的构建、依赖管理和项目信息管理。
#### 操作视频
本视频介绍基于图形化构建方式执行Maven构建的操作。
<video controls="controls" preload="none" id="object5554544184611" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/cloudbuild_video/1635582721199063521.mp4" title="Maven构建" poster="https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000002354278081.jpg" height="300.0000" width="600.0000"></video>
#### 配置Maven构建
CodeArts Build支持图形化构建和代码化构建两种方式。
- [图形化构建]
  在[配置构建步骤](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0059.html)中，添加"Maven构建"构建步骤，参考[表1]配置参数。
   表1Maven构建步骤参数说明 
  | **参数**              | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
  |:---|:---|
  | 步骤显示名称              | 构建步骤的名称，可自定义修改。 - 支持中文、英文、数字、"-"、"_"、英文逗号、英文分号、英文冒号、"."、"/"、圆括号（中英文）。  - 字符长度范围为1\~128。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
  | 工具版本                | 根据用户实际开发环境的需要，选择对应的工具版本。 CodeArts Build支持的工具版本，可查看[构建工具版本](https://support.huaweicloud.com/productdesc-codeci/cloudbuild_07_0004.html)。若当前的工具版本不满足您的使用要求，您可以[制作镜像并推送到SWR仓库](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0013.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
  | 命令                  | 配置Maven命令，一般使用系统默认生成的命令即可。如果需要配置更多命令，可参考[Maven官网](https://maven.apache.org/index.html)。 如果使用私有依赖库，需配置忽略证书命令，不同Maven版本命令不同。 - Maven 3.8及以下版本： ``` -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true ```   - Maven 3.9及以上版本： ``` -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Dmaven.resolver.transport=wagon ```                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
  | 失败后是否继续运行           | 当前步骤执行失败后是否继续执行下一个步骤，根据实际使用场景选择是或否。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  | setting配置           | - 自动生成setting文件并配置依赖仓库：可根据用户的IP不同，自动识别最优站点访问CodeArts提供的"setting.xml"文件。 国内用户使用"国内站点"，国际用户使用"国际站点"。建议使用默认配置。 "setting.xml"文件中定义了默认的依赖拉取顺序和镜像源代理等配置信息，如果需要使用自定义的"setting.xml"文件，可[添加自定义setting.xml文件]，然后在默认的打包命令末尾添加--settings settings.xml，即可使用已添加的"settings.xml"文件执行Maven构建。 ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000001945920284.png)   - 公有依赖仓库：默认已添加华为开源镜像站，同时配置了HuaweiSDK仓库。此配置仅在需要添加非CodeArts提供的公有依赖仓库时使用，添加方法如下： 1. 单击"添加"。  2. 填写公有依赖仓库地址，根据需要勾选"release仓库"和"snapshot仓库"。release仓库和snapshot仓库至少勾选一个，也可以同时勾选。 release仓库：勾选后，构建过程将尝试从仓库中下载release版本依赖。 snapshot仓库：勾选后，构建过程将尝试从仓库中下载snapshot版本依赖。     - 私有依赖库：默认已配置CodeArts提供的私有依赖仓库。此配置仅在需要添加其它私有依赖仓库时使用，添加方法如下： 1. [新建nexus repository服务扩展点](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0019.html)。  2. 单击"添加"，选择上一步创建的服务扩展点，并根据需要勾选"release仓库"和"snapshot仓库"。 "release仓库"和"snapshot仓库"两种仓库对应的使用场景区分如下，使用时要务必注意区分，避免出现如"将依赖上传到软件发布库但是构建时无法下载"此类场景。 - "snapshot仓库"：对于以调试为目的发布的私有依赖包，一般会给依赖版本号增加-SNAPSHOT后缀（如：1.0.0-SNAPSHOT），执行发布操作时，此类依赖会自动发布到snapshot仓库，发布时无需更新版本号，构建命令中增加-U参数即可拉取最新版本。  - 对于正式发布的私有依赖包，版本号中不可带-SNAPSHOT后缀（如：1.0.0），执行发布操作时，此类依赖会自动发布到release仓库，发布时必须更新版本号，否则会导致构建过程无法拉取最新依赖包。        |
  | 发布依赖包到CodeArts私有依赖库 | 编译构建服务默认使用私有依赖库作为私有依赖下载源，如果需要将构建产物上传至私有依赖库供其他项目依赖使用，则需要添加此配置。配置前，需已[创建私有依赖库](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_01_0008.html)。配置方法如下： - 不配置pom：表示无需发布私有依赖包到CodeArts私有依赖库。  - 配置所有pom：表示在项目下所有"pom.xml"文件增加deploy配置，使用**mvn deploy** 命令将构建出的依赖包上传到私有依赖仓库。 配置后，需在命令窗口，使用"#"注释命令mvn package -Dmaven.test.skip=true -U -e -X -B，如下图： ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000001910907994.png) 删除#mvn deploy -Dmaven.test.skip=true -U -e -X -B命令前的"#"，如下图： ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000001944387161.png)    上传的私有依赖包，在其他项目添加pom.xml文件中的groupId、artifactId、version坐标即可引用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  | 单元测试                | 如果用户需要对单元测试结果进行处理，可配置此项。详见[配置单元测试]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | 缓存配置                | 选择是否使用缓存以提高构建速度，选择"使用缓存"后，每次构建时会把下载依赖包缓存起来，后续构建无需重复拉取，可有效提高构建速度。 Maven构建的依赖包存入缓存之后，只有当租户下面构建的项目有引进新的依赖包时，才会更新缓存目录，并不支持对已有的依赖包缓存文件进行更新。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
     
- [代码化构建]
  参考以下代码示例，修改在[创建代码化构建使用的YAML文件](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0058.html#codeci_ug_0058__section72391847131511)中的BUILD部分代码信息。
  ```
  version: 2.0 # 必须是2.0
  steps:
    BUILD:
      - maven:
            image: cloudbuild@maven3.5.3-jdk8-open# 可以自定义镜像地址
            inputs:
              settings:
                public_repos:
                  - https://mirrors.example.com/maven
              cache: true # 是否开启缓存
              unit_test:
                coverage: true
                ignore_errors: false
                report_path: "**/TEST*.xml"
                enable: true
                coverage_report_path: "**/site/jacoco"
              command: mvn package -Dmaven.test.failure.ignore=true -U -e -X -B
              ignore_fail: true
  ```
  表2代码示例参数说明 
  | **参数**      | **类型** | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  |:---|:---|:---|
  | image       | string | 填写镜像地址，有以下两种格式。 - cloudbuild@maven3.5.3-jdk8-open：以cloudbuild开始，@作为分隔符，后面是编译构建提供的默认镜像，编译构建支持的镜像构建工具版本可参考[构建工具版本](https://support.huaweicloud.com/productdesc-codeci/cloudbuild_07_0004.html)。  - 完整的swr镜像地址，例如：swr.example.example.com/codeci_test/demo:141d26c455abd6d7xxxxxxxxxxxxxxxxxxxx 镜像地址获取方式可参考[获取SWR镜像地址](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_00142.html#codeci_ug_00142__section2823134019213)。    |
  | settings    | map    | 可选参数。当用户需要使用自定义"settings.xml"文件时，需要配置该参数。 不配置，则默认使用CodeArts提供的setting.xml文件，如果需要使用自定义的"settings.xml"文件，可先[添加自定义setting.xml文件]，然后在默认的打包命令mvn package -Dmaven.test.failure.ignore=true -U -e -X -B末尾添加--settings settings.xml。                                                                                                                                                                                                                                                                                                                                                                                                  |
  | cache       | bool   | 可选参数。 配置是否开启缓存。 - true：开启。  - false：不开启。   默认值：false。                                                                                                                                                                                                                                                                                                                                                                                                  |
  | command     | string | 配置执行的Maven命令。如果需要配置更多命令，可参考[Maven官网](https://maven.apache.org/index.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
  | unit_test   | map    | 可选参数。 配置单元测试。详细操作指导参考[配置单元测试]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
  | ignore_fail | string | 用于控制当前步骤执行失败后是否继续执行下一个步骤。 - true：是。  - 为空：否。                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     
 #### 添加自定义"setting.xml"文件
上传文件的约束限制条件如下：
- 文件大小限制为100k。
- 文件类型限制为：**.xml、.key、.keystore、.jks、.crt、.pem。**
- 最多支持上传20个文件。
 
添加文件有以下两种方式：
- **图形化构建**
  1. 在"Maven构建"的命令窗口执行cat /home/build/.m2/settings.xml命令，任务执行完成后，会在构建日志中展示"settings.xml"文件的内容。
  
  2. 参考构建日志中的"settings.xml"的信息自定义新的"settings.xml"文件。
  
  3. 在"Maven构建"步骤前增加"下载文件管理的文件"构建步骤。 自定义步骤显示名称，工具版本当前仅支持"shell4.2.46-git1.8.3-zip6.00"。
     
  
  4. 单击"上传"，在弹出的窗口中选择[2]中自定义的文件，添加描述，勾选相关协议，然后单击"保存"。
     当用户拥有te_admin权限时，如果未勾选"允许租户内所有成员在编译构建中使用该文件"，非文件创建者，也能够文件下载、删除和编辑文件。
     
  
  5. 在"下载文件"中选择上传的"setting.xml"文件。
   
- **代码化构建**
  参考以下代码示例，修改在[创建代码化构建使用的YAML文件](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0058.html#codeci_ug_0058__section72391847131511)中的BUILD部分代码信息。
  ```
  version: 2.0 # 必须是2.0
  steps:
    BUILD:
      - download_file:
            inputs:
              name: settings.xml
              ignore_fail: true
  ```
  表3下载文件管理的文件代码示例参数说明 
  | **参数**      | **类型** | **说明**                                                                                                                                                                                                                                                |
  |:---|:---|:---|
  | name        | string | setting文件名称。                                                                                                                                                                                                                                          |
  | ignore_fail | string | 用于控制当前步骤执行失败后是否继续执行下一个步骤。 - true：是。  - 为空：否。   |
     
  
#### 其他操作
[配置单元测试]和[配置使用JaCoCo生成单元测试覆盖率报告]为可选操作，请根据实际需要进行配置。
- **单元测试**：Maven构建工具中的单元测试主要用于验证软件代码的基本功能是否按照预期工作。在Maven项目中，通常使用JUnit或其他测试框架来编写和运行这些单元测试。
- **配置使用JaCoCo生成单元测试覆盖率报告**：单元测试覆盖率报告用来衡量代码中哪些部分已经被单元测试覆盖，哪些部分还没有被覆盖。它可以帮助开发人员了解他们的测试是否充分地检查了所有的代码路径和逻辑。
 
#### 配置单元测试
以下以JUnit框架为例，其中JUnit版本需在4.13.1及以上。
1. 配置单元测试前，需要在项目中编写单元测试代码，且需满足如下条件：
   - 单元测试用例代码存放位置需满足Maven默认单元测试用例目录规范及命名规范，或自行在配置中指定用例位置。 如：单元测试用例统一存放在路径为"src/test/java/{{package}}/"，单元测试将在Maven构建过程自动执行。
     
   
   - 项目中不可存在忽略单元测试用例的配置代码，即确保以下代码未存在于项目的"pom.xml"文件中。
     ```
     <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.18.1</version>  
     </plugin>
     ```
     
   
   - "pom.xml"文件中需引入junit依赖，添加的代码示例如下。
     ```
     <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.13.1</version>
      </dependency>
     ```
     
    
2. 在代码仓中创建单元测试类，如[图1]所示。
   图1单元测试文件目录   
   ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000002139240521.png)
   "Demo.java"文件代码示例如下：
   ```
   package test;
    
   public class Demo {
       public String test(Integer i) {
           switch (i) {
               case 1:
                   return "1";
               case 2:
                   return "2";
               default:
                   return "0";
           }
   }
   }
   ```
   "DemoTest.java"文件代码示例如下：
   ```
   package test;
    
   import org.junit.Test;
    
   public class DemoTest {
       private Demo demo=new Demo();
       @Test
       public void  test(){
           assert demo.test(1).equals("1");
           assert demo.test(2).equals("2");
           assert demo.test(3).equals("0");
       }
   }
   ```
   
3. 配置构建步骤中的单元测试**。**
   - **图形化构建**
     1. 在"Maven构建"步骤的命令窗口，使用"#"注释命令mvn package -Dmaven.test.skip=true -U -e -X -B。
        ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000001944387169.png)
        
     
     2. 删除#mvn package -Dmaven.test.failure.ignore=true -U -e -X -B命令前的"#"。
        ![](https://support.huaweicloud.com/usermanual-codeci/zh-cn_image_0000002103575432.png)
        
     
     3. 展开"单元测试"，根据实际需求参考[表4]配置参数。
         表4单元测试配置参数说明 
        | **参数**        | **说明**                                                                                                                                                                                                                                                                             |
        |:---|:---|
        | 是否处理单元测试结果    | 配置是否处理单元测试结果。 - 是：处理。  - 否：不处理。                                    |
        | 是否忽略用例失败      | 当选择处理单元测试结果时，需要配置是否忽略用例失败。 - 是：用例失败时构建任务仍然继续。  - 否：用例失败时构建任务也失败。   |
        | 单元测试结果文件      | 测试报告需要采集单元测试结果用以生成可视化报告，需在此处填写单元测试结果文件存放路径。 多数情况下，保留默认路径"\*\*/TEST\*.xml"即可满足任务需求。为增加结果准确性，可根据实际情况制定精确的报告路径，如："target/surefire-reports/TEST\*.xml"。                                                                                              |
        | 是否处理单元测试覆盖率结果 | 根据实际需要配置"是否处理单元测试覆盖率结果"，若选"是"，会处理单元测试覆盖率报告。配置方法请参见[使用JaCoCo生成单元测试覆盖率报告]。                                                                                                                                                                   |
        | 单元测试覆盖率报告路径   | 当选择处理单元测试覆盖率结果时，需填写相对于项目根目录的相对路径，如：target/site/jacoco，选择处理单元测试覆盖率结果后，会将此目录下的所有文件进行打包上传。                                                                                                                                                                                            |
           
        
      
   
   - **代码化构建**
     参考以下代码示例，修改在[创建代码化构建使用的YAML文件](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0058.html#codeci_ug_0058__section72391847131511)中的BUILD部分代码信息。
     ```
     version: 2.0 # 必须是2.0
     steps:
       BUILD:
         - maven:
                 unit_test:
                   coverage: true
                   ignore_errors: false
                   report_path: "**/TEST*.xml"
                   enable: true
                   coverage_report_path: "**/site/jacoco"
                 command: mvn package -Dmaven.test.failure.ignore=true -U -e -X -B
     ```
     表5单元测试参数说明 
     | **参数**               | **类型** | **说明**                                                                                                                                                                                                                                                                                                                                                                                  |
     |:---|:---|:---|
     | enable               | bool   | 可选参数。 配置是否处理单元测试结果。 - true：处理。配置"true"，需要mvn命令末尾增加-Dmaven.test.failure.ignore=true参数。  - false：不处理。   默认值：true。                        |
     | ignore_errors        | bool   | 可选参数。 配置是否忽略用例失败。 - true：忽略，用例失败时构建任务仍然继续。  - false：不忽略，用例失败时构建任务也失败   默认值：true。                                                  |
     | report_path          | String | 填写单元测试数据存储路径。可根据实际情况制定精确的报告路径，如："target/surefire-reports/TEST\*.xml"。                                                                                                                                                                                                                                                                                                                   |
     | coverage             | bool   | 可选参数。 配置是否处理覆盖率数据。若配置"true"，配置方法请参见[使用JaCoCo生成单元测试覆盖率报告]。 - true：处理。  - false：不处理。   默认值：false。 |
     | coverage_report_path | string | 可选参数。 当选择处理单元测试覆盖率结果时，需填写相对于项目根目录的相对路径，如：target/site/jacoco，选择处理单元测试覆盖率结果后，会将此目录下的所有文件进行打包上传。                                                                                                                                                                                                                                                         |
        
     
    
4. 配置完成后，如果构建任务执行成功，即可在任务执行详情页面的"测试"页签查看测试报告。如果选择了处理单元测试覆盖率报告，会生成覆盖率测试报告，单击"覆盖率报告下载"即可下载。
 
#### 配置使用JaCoCo生成单元测试覆盖率报告
配置单元测试时，如果选择处理单元测试覆盖率结果，则需要按照如下指导进行配置。
- **单模块项目配置方法**
  在项目中已添加jacoco-maven-plugin插件用于生成单元覆盖率报告，即在"pom.xml"文件中添加如下配置：
  JaCoCo的report目标默认是在verify阶段，这里需要将report目标定义为test阶段。
  ```
  <plugin>
       <groupId>org.jacoco</groupId>
       <artifactId>jacoco-maven-plugin</artifactId>
       <version>0.8.5</version>
       <executions>
           <execution>
               <goals>
                   <goal>prepare-agent</goal>
               </goals>
           </execution>
           <execution>
               <id>report</id>
               <phase>test</phase> 
               <goals>
                   <goal>report</goal>
               </goals>
           </execution>
       </executions>
   </plugin>
  ```
  
- **多模块项目配置方法**
  假设多模块项目代码结构如下，以此为例为您介绍如何配置生成单元测试覆盖率报告。
  ```
  ├── module1
  │   └── pom.xml
  ├── module2
  │   └── pom.xml
  ├── module3
  │   └── pom.xml
  ├── pom.xml
  ```
  1. 在项目下添加一个用来聚合的模块，自定义名称如：report，添加聚合模块后的代码结构如下：
     ```
     ├── module1
     │   └── pom.xml
     ├── module2
     │   └── pom.xml
     ├── module3
     │   └── pom.xml
     ├── report
     │   └── pom.xml
     ├── pom.xml
     ```
     
  
  2. 在项目根目录的"pom.xml"文件添加jacoco-maven-plugin插件，代码示例如下。
     ```
     <!-- 配置单元测试覆盖率-->
      <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <version>0.8.3</version>
          <executions>
              <execution>
                  <goals>
                      <goal>prepare-agent</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
     ```
     
  
  3. 配置聚合模块的"pom.xml"文件。 以dependency形式引入所有依赖模块，并使用report-aggregate定义JaCoCo聚合目标。
     ```
     <dependencies>
          <dependency>
              <groupId>${project.groupId}</groupId>
              <artifactId>module1</artifactId>
              <version>${project.version}</version>
          </dependency>
          <dependency>
              <groupId>${project.groupId}</groupId>
              <artifactId>module2</artifactId>
              <version>${project.version}</version>
          </dependency>
          <dependency>
              <groupId>${project.groupId}</groupId>
              <artifactId>module3</artifactId>
              <version>${project.version}</version>
          </dependency>
      </dependencies>
      <build>
          <plugins>
              <plugin>
                  <groupId>org.jacoco</groupId>
                  <artifactId>jacoco-maven-plugin</artifactId>
                  <version>0.8.3</version>
                  <executions>
                      <execution>
                          <id>report-aggregate</id>
                          <phase>test</phase>
                          <goals>
                              <goal>report-aggregate</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
          </plugins>
      </build>
     ```
     
  
  4. 配置完成后，在项目根目录下执行mvn test，执行成功后会在"report/target/site/jacoco-aggregate"目录下生成各个模块的覆盖率报告。也可以在outputDirectory中自定义报告的输出路径：
     ```
     <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <version>0.8.3</version>
          <executions>
              <execution>
                  <id>report-aggregate</id>
                  <phase>test</phase>
                  <goals>
                      <goal>report-aggregate</goal>
                  </goals>
                  <configuration>
                      <outputDirectory>target/site/jacoco</outputDirectory>
                  </configuration>
              </execution>
          </executions>
      </plugin>
     ```
     
   
 
#### 相关文档
- Maven构建常见可参考[使用Maven构建时常见问题](https://support.huaweicloud.com/codeci_faq/codeci_02_0002.html)。
- 相关最佳实践可参考[CodeArts Build最佳实践](https://support.huaweicloud.com/bestpractice-codeci/codeci_practice_1022.html)中Maven构建构建的案例。
- 构建报告相关API可参考[构建报告](https://support.huaweicloud.com/api-codeci/ListJunitCoverageSummary.html)。
 
