SonarQube Groovy插件无法识别指定目录下的Groovy源码文件
我之前维护Java/Groovy混合项目时也碰到过一模一样的问题——SonarQube默认只会扫描src/main/java下的Groovy文件,单独的src/main/groovy和src/test/groovy目录完全被忽略。好在通过调整Maven和SonarQube的配置,就能保留现有目录结构并让扫描正常工作,具体步骤如下:
1. 配置Maven Groovy插件,让Maven识别Groovy源码
首先要确保Maven能正确识别你的Groovy源码目录,这样SonarQube才能通过Maven插件获取到这些文件。推荐使用gmavenplus-plugin(比旧的gmaven插件更稳定),在项目的pom.xml中添加以下配置:
<build> <plugins> <plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.12.1</version> <!-- 选择兼容你Maven和Groovy版本的版本 --> <executions> <execution> <goals> <goal>addSources</goal> <goal>addTestSources</goal> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <sources> <source> <directory>${project.basedir}/src/main/groovy</directory> <includes> <include>**/*.groovy</include> </includes> </source> </sources> <testSources> <testSource> <directory>${project.basedir}/src/test/groovy</directory> <includes> <include>**/*.groovy</include> </includes> </testSource> </testSources> </configuration> </plugin> </plugins> </build>
这个配置会告诉Maven把src/main/groovy和src/test/groovy分别当成主源码和测试源码目录,同时完成Groovy代码的编译。
2. 告诉SonarQube扫描Groovy专属目录
接下来需要配置SonarQube的扫描参数,明确指定Groovy的源码和测试源码路径。你可以直接在pom.xml的<properties>节点中添加:
<properties> <!-- 指定Groovy主源码目录 --> <sonar.groovy.sources>src/main/groovy</sonar.groovy.sources> <!-- 指定Groovy测试源码目录 --> <sonar.groovy.test.sources>src/test/groovy</sonar.groovy.test.sources> <!-- 保留Java源码目录的配置 --> <sonar.java.sources>src/main/java</sonar.java.sources> <sonar.java.test.sources>src/test/java</sonar.java.test.sources> </properties>
如果不想修改pom.xml,也可以在执行Sonar扫描命令时直接传递参数:
mvn sonar:sonar \ -Dsonar.groovy.sources=src/main/groovy \ -Dsonar.groovy.test.sources=src/test/groovy \ -Dsonar.java.sources=src/main/java \ -Dsonar.java.test.sources=src/test/java
为什么移到src/main/java能识别?
SonarQube的Java插件默认会扫描src/main/java下的所有文件,包括Groovy文件,这时候Groovy插件会接管这些文件的分析。但单独的groovy目录不在默认扫描路径里,必须通过sonar.groovy.sources参数明确告知Groovy插件去扫描这些目录。
完成以上配置后,重新执行Sonar扫描,src/main/groovy和src/test/groovy下的Groovy文件就会被正常识别和分析了。
内容的提问来源于stack exchange,提问作者Marco Baumeler

