You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Pipelines Maven@4迁移多模块项目时Child module不存在报错

Maven@4迁移后多模块项目报错:子模块不存在及Sonar JaCoCo兼容问题

问题概述

将Azure Pipelines的Maven@3任务迁移至Maven@4后,多模块项目出现两个核心问题:

  1. Maven构建报错:Child module /home/vsts/work/1/s/service/CCReport43F6D5EF of /home/vsts/work/1/s/service/pom.xml does not exist
  2. SonarCloud提示:Property 'sonar.jacoco.reportPaths' is no longer supported. Use JaCoCo's xml report and sonar-jacoco plugin.

问题根源

  1. Maven@4参数变化:Maven@3会自动向Maven命令添加sonar.jacoco.reportPaths和sonar.coverage.jacoco.xmlReportPaths参数,而Maven@4移除了该自动行为,导致Sonar无法找到JaCoCo报告。
  2. JaCoCo配置误导Maven模块解析:JaCoCo插件配置中<excludes>**/*IT, **/CCReport43F6D5EF/</excludes>的路径写法,让Maven误将CCReport43F6D5EF识别为service模块的子项目,而实际该目录并不存在。
  3. Sonar参数废弃:sonar.jacoco.reportPaths已被Sonar废弃,必须使用基于XML格式的报告路径参数sonar.coverage.jacoco.xmlReportPaths。

解决方案

方案1:修正JaCoCo排除路径配置

调整JaCoCo插件的排除规则,明确指定排除class文件而非目录,避免Maven误解析为子模块:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>${jacoco-maven-plugin.version}</version>
    <configuration>
        <!-- 明确排除class文件,而非目录 -->
        <excludes>**/*IT.class, **/CCReport43F6D5EF/**/*.class</excludes>
    </configuration>
    <executions>
        <!-- 保持原有execution配置不变 -->
        <execution>
            <id>prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <phase>initialize</phase>
        </execution>
        <execution>
            <id>report</id>
            <goals>
                <goal>report</goal>
            </goals>
            <phase>prepare-package</phase>
            <configuration>
                <formats>
                    <format>XML</format>
                </formats>
            </configuration>
        </execution>
        <execution>
            <id>post-unit-test</id>
            <goals>
                <goal>report</goal>
            </goals>
            <phase>test</phase>
        </execution>
    </executions>
</plugin>

方案2:调整Maven@4任务,手动传递正确的Sonar参数

在Maven@4任务中添加options参数,指定Sonar所需的JaCoCo XML报告路径(使用流水线变量确保路径灵活性):

- task: Maven@4
  displayName: 'Maven Package'
  inputs:
    mavenPomFile: 'service/pom.xml'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.17'
    jdkArchitectureOption: 'x64'
    codeCoverageToolOption: jaCoCo
    publishJUnitResults: true
    testResultsFiles: '**/surefire-reports/TEST-*.xml'
    goals: 'clean package'
    isJacocoCoverageReportXML: true
    sonarQubeRunAnalysis: true
    # 手动添加Sonar所需的JaCoCo XML报告路径,匹配所有子模块的报告
    options: '-Dsonar.coverage.jacoco.xmlReportPaths=$(Build.SourcesDirectory)/**/target/site/jacoco/jacoco.xml'

方案3:分离Maven构建与Sonar分析任务

将Sonar分析从Maven任务中拆分出来,使用独立的SonarQube任务,避免参数耦合:

# 第一步:仅执行Maven构建并生成JaCoCo报告
- task: Maven@4
  displayName: 'Maven Build with JaCoCo'
  inputs:
    mavenPomFile: 'service/pom.xml'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.17'
    jdkArchitectureOption: 'x64'
    codeCoverageToolOption: jaCoCo
    publishJUnitResults: true
    testResultsFiles: '**/surefire-reports/TEST-*.xml'
    goals: 'clean package'
    isJacocoCoverageReportXML: true

# 第二步:准备Sonar分析
- task: SonarQubePrepare@5
  displayName: 'Prepare SonarQube Analysis'
  inputs:
    SonarQube: '你的SonarQube连接名称'
    scannerMode: 'Maven' # 选择Maven模式适配多模块项目
    projectKey: '你的项目Key'
    projectName: '你的项目名称'
    extraProperties: |
      # 指定所有子模块的JaCoCo XML报告路径
      sonar.coverage.jacoco.xmlReportPaths=$(Build.SourcesDirectory)/**/target/site/jacoco/jacoco.xml

# 第三步:执行Sonar分析
- task: SonarQubeAnalyze@5
  displayName: 'Run SonarQube Analysis'

# 第四步:发布Sonar结果
- task: SonarQubePublish@5
  displayName: 'Publish SonarQube Results'
  inputs:
    pollingTimeoutSec: '300'

方案4:紧急规避方案(临时回退)

若上述方案无法立即生效,可暂时:

  • 保留Maven@3任务,待兼容性问题排查完成后再迁移
  • 禁用Maven@4任务中的Sonar分析,改用SonarScanner CLI单独执行扫描

内容的提问来源于stack exchange,提问作者Joost Luijben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:05:03