Azure Pipelines Maven@4迁移多模块项目时Child module不存在报错
Maven@4迁移后多模块项目报错:子模块不存在及Sonar JaCoCo兼容问题
问题概述
将Azure Pipelines的Maven@3任务迁移至Maven@4后,多模块项目出现两个核心问题:
- Maven构建报错:
Child module /home/vsts/work/1/s/service/CCReport43F6D5EF of /home/vsts/work/1/s/service/pom.xml does not exist - SonarCloud提示:
Property 'sonar.jacoco.reportPaths' is no longer supported. Use JaCoCo's xml report and sonar-jacoco plugin.
问题根源
- Maven@4参数变化:Maven@3会自动向Maven命令添加
sonar.jacoco.reportPaths和sonar.coverage.jacoco.xmlReportPaths参数,而Maven@4移除了该自动行为,导致Sonar无法找到JaCoCo报告。 - JaCoCo配置误导Maven模块解析:JaCoCo插件配置中
<excludes>**/*IT, **/CCReport43F6D5EF/</excludes>的路径写法,让Maven误将CCReport43F6D5EF识别为service模块的子项目,而实际该目录并不存在。 - 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
相关产品推荐
相关产品推荐

