Maven SonarQube多模块

8

我有一个由几个模块组成的项目。

我正在尝试使用SonarQube进行分析。

我已经将Sonar Maven插件作为每个模块的依赖项包含在内:

<dependency>
  <groupId>org.codehaus.sonar</groupId>
  <artifactId>sonar-maven-plugin</artifactId>
  <version>5.1</version>
</dependency>

然后我使用以下命令运行Maven:

mvn clean verify sonar:sonar

Maven成功完成,我可以看到Sonar分析正在进行,但是当我打开Sonar UI时,模块在项目中不可见。

然而...

如果我从单个模块目录运行Maven命令,则该模块在项目中可见。

感觉我错过了非常简单的东西,感谢任何帮助!

2个回答

11

sonar-maven-plugin不再作为依赖项,而是放在根pom.xml<build>部分中,如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.sonarsource.scanner.maven</groupId>
            <artifactId>sonar-maven-plugin</artifactId>
            <version>3.0.1</version>
        </plugin>
    </plugins>
</build>

由于这是一个多模块项目,因此您应该从根项目中进行安装,然后作为专用步骤运行sonar:sonar目标,具体操作请参考使用Maven的SonarQube Scanner分析项目

mvn clean install
mvn sonar:sonar

要配置SonarQube服务器的URL,请在您的settings.xmlpom.xml中指定项目属性sonar.host.url,具体步骤请参见使用SonarQube Scanner for Maven进行分析

<properties>
    <!-- Optional URL to server. Default value is http://localhost:9000 -->
    <sonar.host.url>http://myserver:9000</sonar.host.url>
</properties>

这看起来已经奏效了。当我从单个模块运行时,我需要删除我创建的Sonar项目,但是在遵循此步骤后,我可以看到创建的项目。似乎v5.1不可用作插件,我不得不使用2.7.1代替。作为Maven专家,我不确定为什么会这样...? - timothyclifford
1
SonarQube Scanner for Maven的版本与SonarQube服务器版本不匹配。请查看http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven#AnalyzingwithSonarQubeScannerforMaven-HowtoFixVersionofMavenPlugin。 - Julien H. - SonarSource Team
@timothyclifford 正如Julien H.所提到的,Maven插件与SonarQube本身有不同的版本控制。我已经更正了答案,以包含最新版本的插件的groupId/artifactId/version,该插件与SonarQube服务器v5.1兼容。 - heenenee
感谢@AbrahamGrief,看来您是正确的。我对其他版本(4、5)支持了什么感到困惑?http://mvnrepository.com/artifact/org.codehaus.sonar/sonar-maven-plugin 有什么想法吗? - timothyclifford
@timothyclifford 我从wiki推断出,maven插件的版本3.0.1支持4.5及以上的版本。我建议避免使用groupId中带有codehaus的任何构件,因为codehaus已经停止运营,除非你想让一些旧的东西工作。 - heenenee
显示剩余5条评论

1

SonarQube支持多模块项目,就像Maven一样。这意味着包含多个模块的Maven项目映射到包含多个模块/组件的SonarQube项目,而不是多个项目。

以SonarQube代码为例(它是一个多模块Maven项目):父项目聚合了所有子模块的信息,然后如果您检查其结构(或其代码页面),您可以看到所有子组件的列表(例如:SonarQube::Core

底线是您看到了预期行为。 Maven 项目的子模块不应被视为项目进行分析,您应始终分析父项目,SonarQube 将原生处理模块。

1
Nicolas,请问你能解释一下为什么需要单独调用Maven,就像@heenenee所报告的那样吗?因为这似乎与Maven通常的工作方式相矛盾;例如,不必分别运行“mvn clean”和“mvn install”,只需运行“mvn clean install”。谢谢。 - chrisinmtown
2
提供的链接已经失效。 - Tobi Tiggers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接