为什么在使用Sonar:Sonar之前需要进行MVN Install操作?

6

官方文档http://docs.sonarqube.org/display/SONAR/Analyzing+with+Maven表示,调用Sonar的正确方式是:

mvn clean install -DskipTests=true
mvn sonar:sonar

但是并没有说原因。Sonar是如何工作的?它需要编译后的类吗?那为什么不只运行mvn clean compile呢?还是它需要一个jar文件?那为什么不只运行mvn clean package呢?Sonar插件到底是做什么用的?


1
如果我没错的话,一些分析是直接针对jar/war/ear最终文件进行的。这是有道理的,因为它是你在生产中要使用的。 - Pablo Lozano
那为什么不使用 mvn clean package 呢? - piotrek
我从未跳过测试,Sonar 对我来说也很好用。 - Jackie
3个回答

3

SonarSource团队成员的解释:

在多模块构建中,聚合器插件无法从目标文件夹中解析依赖项。因此,您有两个选择:

  • mvn clean install && mvn sonar:sonar 作为两个独立的进程
  • mvn clean package sonar:sonar 作为单个反应堆

我也感到惊讶,所以我发了一条推文并收到了来自官方Maven账户的以下答复:

如果插件没有设计使用target/classes文件夹作为替代,则在*不同会话中运行*时需要安装才能获取jar包。如果插件作者强制要求您使用install而没有foo原因,请向他们抱怨。[ed - @connolly_s]

1
SonarQube分析器确实需要已编译的类(例如用于Findbugs规则、覆盖率)。默认情况下,它会执行测试,因此编译阶段可以跳过测试。

我理解skipTests部分。但是为什么要用install呢?为什么不直接用mvn clean package呢? - piotrek
可能那个“package”就足够了,但这取决于“compile”和“install”之间的其他构建阶段/插件。 - Mithfindel

1
如果您满足以下要求,就可以在单个Maven命令中运行SonarQube:
- 正如Mithfindel所提到的,一些SonarQube插件需要分析.class文件。如果您在SonarQube之外运行单元测试,那么测试插件必须读取“test”阶段的输出。 - 有集成测试吗?那么您需要在“integration-test”阶段之后运行。 - 如果您想将SonarQube作为真正的质量门控,则绝对必须在“deploy”阶段之前运行它。
一种解决方案是将SonarQube附加到“package”阶段后运行。然后,您可以通过简单的“clean install”或“clean deploy”获得完整的构建。大多数人不这样做是因为SonarQube很耗时,但4.0中添加的增量模式并在即将推出的4.2中得到了极大改进,解决了这个问题。
根据官方文档,说“构建并运行sonar:sonar”要比说“打开POM,为sonar-maven-plugin添加build元素,将其附加到verify”等更容易。但需要注意的是,SonarQube需要Java 6,因此如果您正在使用JDK 1.5(在大型组织中仍然很常见),则分析将必须在选择了较新的JDK的单独Maven调用中进行。我们通过自定义Maven构建包装器解决了这个问题。

但是从文档中可以看出,Sonar运行自己的测试,因此建议使用-DskipTests=true - piotrek
这是一个因人而异的情况,而不是一条硬性规定。SonarQube并不需要运行测试。实际上,如果你有一个复杂的环境,预先运行测试可能更可取。无论如何,已经有讨论结束这种行为了。对于SonarQube来充当测试运行器,这总是很奇怪的。 - user847316

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