多模块Java项目Maven SonarQube分析报错:文件无法被两次索引
多模块Java项目Maven SonarQube分析配置指南
嘿,我来帮你搞定多模块Java项目的Maven SonarQube分析配置,一步步来,完全不用慌!
第一步:先搞定父POM的统一配置(重中之重)
因为你是多模块项目,所有子模块的Sonar配置最好统一在父pom里定义,这样不用每个子模块重复写一堆配置,省心又不容易错。
首先,在父pom的<properties>节点里添加这些Sonar全局属性:
<properties> <!-- Sonar里的项目唯一标识,建议用父模块的groupId:artifactId,比如com.yourteam:parent-module --> <sonar.projectKey>你的项目唯一标识</sonar.projectKey> <!-- Sonar界面上显示的项目名称,随便起个好认的 --> <sonar.projectName>你的项目显示名称</sonar.projectName> <!-- 项目版本,跟着你实际的版本号来 --> <sonar.projectVersion>1.0.0</sonar.projectVersion> <!-- 代码语言,这里是Java就写java --> <sonar.language>java</sonar.language> <!-- 源码和测试目录,多模块下Sonar会自动识别子模块的src目录,这里统一指定就行 --> <sonar.sources>src/main/java</sonar.sources> <sonar.tests>src/test/java</sonar.tests> <!-- JUnit测试报告的路径,Sonar要靠这个统计测试情况 --> <sonar.junit.reportPaths>target/surefire-reports</sonar.junit.reportPaths> <!-- 你的SonarQube服务器地址,比如本地的就是http://localhost:9000 --> <sonar.host.url>你的Sonar服务器地址</sonar.host.url> </properties>
然后在父pom的<build>里添加SonarQube Maven插件,记得绑定到verify阶段,这样执行命令时会先跑测试再做分析:
<build> <pluginManagement> <plugins> <!-- Sonar扫描插件,用最新稳定版就行,比如现在推荐4.0+版本 --> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>4.0.0.2929</version> <!-- 可以去Maven仓库查最新版替换 --> </plugin> </plugins> </pluginManagement> </build>
第二步:完善settings.xml里的Profile配置
你说已经在settings.xml里加了profile,这里给你补全正确的内容,主要是配置Sonar的认证信息,这样每次执行命令不用输密码,方便得很:
<settings> <profiles> <profile> <id>sonar</id> <!-- 让这个profile默认激活,不用每次手动指定 --> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- 这里用Sonar令牌最安全,去Sonar服务器的个人设置里生成一个就行 --> <sonar.login>你的SonarQube令牌</sonar.login> <!-- 如果实在想用密码,就把下面这行注释取消,替换成你的密码,但还是推荐令牌哦 --> <!-- <sonar.password>你的Sonar登录密码</sonar.password> --> </properties> </profile> </profiles> </settings>
第三步:执行分析命令,坐等结果
打开终端,切换到父模块的根目录(就是放着父pom.xml的那个文件夹),执行这条命令:
mvn clean verify sonar:sonar
clean:先把之前的构建产物清掉,避免旧文件干扰分析结果verify:跑所有子模块的测试,生成测试报告,Sonar需要这个来统计测试覆盖率和通过率sonar:sonar:启动Sonar扫描,会自动遍历所有子模块,把分析结果上传到你的Sonar服务器
常见小问题排查
- 子模块没被扫描到?:检查父pom里的
<modules>标签是不是把所有子模块都列进去了,比如<module>module-1</module>、<module>module-2</module>这些,Sonar是跟着这个列表找子模块的。 - 测试覆盖率不显示?:那大概率是没加覆盖率插件,推荐用Jacoco,在父pom里加这个配置就行,Sonar会自动读取Jacoco的报告:
<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.8</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> </plugins> </build>
- 连不上Sonar服务器?:先检查
sonar.host.url是不是写对了,再看看网络能不能访问服务器,最后确认sonar.login的令牌是不是有效(令牌过期或者权限不够也会失败)。
内容的提问来源于stack exchange,提问作者user4479510
相关产品推荐
相关产品推荐

