我们可以对 Sonar 的 PMD 插件和 Eclipse 的 PMD 插件使用相同的抑制警告吗?

Can we use the same suppress warning for both sonar's PMD plug-in and Eclipse's PMD plug-in?

我在 Jenkins 上使用 Sonar 的 PMD 插件对我的代码进行静态分析。我也是 运行 Eclipse 的 PMD 插件(准确地说是 eclipse-pmd 1.5 ( http://marketplace.eclipse.org/content/eclipse-pmd ))。

我的问题如下:我想抑制某个 PMD 警告。假设我想在我的 class 命名规则上抑制警告 ShortClassName (http://pmd.sourceforge.net/pmd-5.1.1/rules/java/naming.html)。看下面的例子:

@SuppressWarnings("pmd:ShortClassName")
public class Role {
    //The class fields, constructors, methods ...
}

这可以很好地抑制 Sonar 上的警告。但是,它不会抑制 eclipse-pmd 上的警告。要做到这一点,我必须做到以下几点:

@SuppressWarnings({ "pmd:ShortClassName" , "PMD.ShortClassName" })
public class Role {
    //The class fields, constructors, methods ...
}

当然可以,但是它会使代码膨胀。基本上,为了与我的两个插件保持一致,我必须(几乎)写两次相同的抑制警告。

所以我的问题如下:有没有办法从 PMD 的 eclipse-pmd 插件更改警告名称前缀。到 pmd: ,所以相同的 @SuppressWarnings 将抑制来自 Sonar 和 eclipse-pmd 的警告?

我不认为这是可能的,但您可以摆脱 Eclipse PMD 插件并使用 Eclipse 的 SonarQube 插件。这样您只需在 SonarQube 上解决问题(通过注释或将问题标记为误报)。

不,在 eclipse-pmd 中无法将前缀从 "PMD." 更改为 "pmd:"(我知道,因为我创建了 eclipse-pmd)。

但是也可以只使用其中一种格式。存在这两种格式的原因是 Sonar 和 eclipse-pmd 使用不同的规则引擎来分析代码。 eclipse-pmd 使用原始的 PMD 引擎。 Sonar 过去曾使用相同的引擎,但几年前他们决定编写自己的引擎并为他们的引擎重写大部分 PMD 规则。规则大部分相同,但遗憾的是并非 100% 兼容。 SuppressWarnings 格式是这些不兼容性之一。

您必须决定要使用哪个引擎。如果要使用 Sonar 引擎,则使用 SonarQube Eclipse Plugin and of course Sonar. If you want to use the original PMD engine then use eclipse-pmd and the PMD plugin for Sonar(PMD 规则使用 PMD 引擎而不是 Sonar 引擎)。

两种方式各有优缺点。如果您使用 Sonar 引擎,分析应该会更快,特别是如果您还使用 Checkstyle 和 Findbugs 规则。然而,SonarSource 仍在重写规则的过程中,因此您目前不会拥有 PMD(或 Checkstyle 和 Findbugs)中可用的所有规则。