自定义 PMD Java 违反规则未显示在 SonarQube 上
Custom PMD Java rule violations not showing on SonarQube
我正在尝试 运行 我在 SonarQube 上的自定义 PMD 规则,但到目前为止,没有成功。
我创建了一个扩展自 sonar-pmd-plugin 的插件。在这个插件中,我有我的 PMD 规则集文件 (custom_rules.xml)、一个 Sonar 规则文件 (pmd-extensions.xml) 和我的自定义规则的 Java classes。
SonarQube 识别我的规则,我已在我的默认质量配置文件中启用它们。最后,当我 运行 对给定项目进行声纳分析时,我发现我的自定义规则已正确执行,并且它们发现了正在分析的项目中的违规行为。
但是,这些违规行为从未显示在 SonarQube 的项目仪表板上。
我使用的SonarQube版本是5.1.1。 PMD插件的版本是2.4.1。
我为这个问题创建了一个最小的例子,只有一个自定义规则。
custom_rules.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="My custom rules" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<rule
language="java"
name="RuleJavaAssert"
message="Avoid assert in production"
class="br.gov.tcu.rules.RuleJavaAssert">
<description>Production code should not use the assert command</description>
<priority>3</priority>
</rule>
</ruleset>
pmd-extensions.xml:
<rules>
<rule>
<key>br.gov.tcu.rules.RuleJavaAssert</key>
<name>Avoid assert in production</name>
<category name="Maintainability" />
<priority>BLOCKER</priority>
<description>Production code should not use the assert command</description>
<configKey>br/gov/tcu/rules/custom_rules.xml/RuleJavaAssert</configKey>
</rule>
</rules>
RuleJavaAssert.java:
public class RuleJavaAssert extends AbstractJavaRule {
@Override
public Object visit(ASTAssertStatement node, Object data) {
System.err.println("Found violation");
addViolation(data, node);
return super.visit(node, data);
}
}
AssertViolation.java:
public class AssertViolation {
public static void testMethod() {
String test = "test";
assert(test != null);
}
}
当 运行 针对包含 class "AssertViolation.java":
的项目时,控制台上 SonarQube 分析的输出
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building teste-pmd 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- sonar-maven-plugin:2.7.1:sonar (default-cli) @ teste-pmd ---
[INFO] User cache: D:\Users\x02315941199\.sonar\cache
[INFO] SonarQube version: 5.1.1
(...)
[INFO] [15:48:17.564] Sensor PmdSensor
[INFO] [15:48:17.564] Execute PMD 5.3.1...
[INFO] [15:48:17.580] Java version: 1.7
[INFO] [15:48:17.595] PMD configuration: D:\Users\x02315941199\Documents\PMD\workspace\teste-pmd\target\sonar\pmd.xml
Found violation
[INFO] [15:48:17.815] PMD configuration: D:\Users\x02315941199\Documents\PMD\workspace\teste-pmd\target\sonar\pmd-unit-tests.xml
[INFO] [15:48:17.815] Execute PMD 5.3.1 done: 251 ms
[INFO] [15:48:17.971] Sensor PmdSensor (done) | time=407ms
(...)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.185 s
[INFO] Finished at: 2015-11-11T15:48:19-02:00
[INFO] Final Memory: 72M/741M
[INFO] ------------------------------------------------------------------------
从控制台消息"Found violation"我可以看到规则已正确执行,但 SonarQube 仍然指示 0 个问题。
有什么想法吗?
谢谢
SonarQube 不显示违规的原因是 sonar-pmd-plugin 中的违规记录器通过其键搜索规则。
因此,pmd-extensions.xml
文件中的 key
属性必须等于 custom_rules.xml
中规则的 name
属性
提供的示例将通过将 pmd-extensions.xml 内容更改为:
来修复
<rules>
<rule>
<key>RuleJavaAssert</key>
<name>Avoid assert in production</name>
<category name="Maintainability" />
<priority>BLOCKER</priority>
<description>Production code should not use the assert command</description>
<configKey>br/gov/tcu/rules/custom_rules.xml/RuleJavaAssert</configKey>
</rule>
</rules>
我正在尝试 运行 我在 SonarQube 上的自定义 PMD 规则,但到目前为止,没有成功。
我创建了一个扩展自 sonar-pmd-plugin 的插件。在这个插件中,我有我的 PMD 规则集文件 (custom_rules.xml)、一个 Sonar 规则文件 (pmd-extensions.xml) 和我的自定义规则的 Java classes。
SonarQube 识别我的规则,我已在我的默认质量配置文件中启用它们。最后,当我 运行 对给定项目进行声纳分析时,我发现我的自定义规则已正确执行,并且它们发现了正在分析的项目中的违规行为。
但是,这些违规行为从未显示在 SonarQube 的项目仪表板上。
我使用的SonarQube版本是5.1.1。 PMD插件的版本是2.4.1。 我为这个问题创建了一个最小的例子,只有一个自定义规则。
custom_rules.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="My custom rules" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<rule
language="java"
name="RuleJavaAssert"
message="Avoid assert in production"
class="br.gov.tcu.rules.RuleJavaAssert">
<description>Production code should not use the assert command</description>
<priority>3</priority>
</rule>
</ruleset>
pmd-extensions.xml:
<rules>
<rule>
<key>br.gov.tcu.rules.RuleJavaAssert</key>
<name>Avoid assert in production</name>
<category name="Maintainability" />
<priority>BLOCKER</priority>
<description>Production code should not use the assert command</description>
<configKey>br/gov/tcu/rules/custom_rules.xml/RuleJavaAssert</configKey>
</rule>
</rules>
RuleJavaAssert.java:
public class RuleJavaAssert extends AbstractJavaRule {
@Override
public Object visit(ASTAssertStatement node, Object data) {
System.err.println("Found violation");
addViolation(data, node);
return super.visit(node, data);
}
}
AssertViolation.java:
public class AssertViolation {
public static void testMethod() {
String test = "test";
assert(test != null);
}
}
当 运行 针对包含 class "AssertViolation.java":
的项目时,控制台上 SonarQube 分析的输出[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building teste-pmd 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- sonar-maven-plugin:2.7.1:sonar (default-cli) @ teste-pmd ---
[INFO] User cache: D:\Users\x02315941199\.sonar\cache
[INFO] SonarQube version: 5.1.1
(...)
[INFO] [15:48:17.564] Sensor PmdSensor
[INFO] [15:48:17.564] Execute PMD 5.3.1...
[INFO] [15:48:17.580] Java version: 1.7
[INFO] [15:48:17.595] PMD configuration: D:\Users\x02315941199\Documents\PMD\workspace\teste-pmd\target\sonar\pmd.xml
Found violation
[INFO] [15:48:17.815] PMD configuration: D:\Users\x02315941199\Documents\PMD\workspace\teste-pmd\target\sonar\pmd-unit-tests.xml
[INFO] [15:48:17.815] Execute PMD 5.3.1 done: 251 ms
[INFO] [15:48:17.971] Sensor PmdSensor (done) | time=407ms
(...)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.185 s
[INFO] Finished at: 2015-11-11T15:48:19-02:00
[INFO] Final Memory: 72M/741M
[INFO] ------------------------------------------------------------------------
从控制台消息"Found violation"我可以看到规则已正确执行,但 SonarQube 仍然指示 0 个问题。
有什么想法吗? 谢谢
SonarQube 不显示违规的原因是 sonar-pmd-plugin 中的违规记录器通过其键搜索规则。
因此,pmd-extensions.xml
文件中的 key
属性必须等于 custom_rules.xml
name
属性
提供的示例将通过将 pmd-extensions.xml 内容更改为:
来修复<rules>
<rule>
<key>RuleJavaAssert</key>
<name>Avoid assert in production</name>
<category name="Maintainability" />
<priority>BLOCKER</priority>
<description>Production code should not use the assert command</description>
<configKey>br/gov/tcu/rules/custom_rules.xml/RuleJavaAssert</configKey>
</rule>
</rules>