我正在寻找一种解决方案,允许我使用PMD检查短变量名称,同时从此规则中排除lambda。
主要原因是,IntelliJ使用单个字符自动命名常见的lamba变量,尤其是。 java.lang.String
总是缩写为
aListFullOfStrings.forEach(s -> s.replaceAll(" ", ""));
我更喜欢这个缩写,但我不想为所有的lambdas添加抑制。我找不到任何方法来调整我的PMD规则以便优雅地解决这个问题。
建议非常感谢 - 我对他们的所有配置都不熟悉。
答案 0 :(得分:2)
您可以利用PMD的基于xpath
的抑制功能。
在规则集XML上,只需为此特定规则配置属性:
<rule ref="rulesets/java/naming.xml/ShortMethodName">
<properties>
<property name="violationSuppressXPath" value=".[ancestor::LambdaExpression]"/>
</properties>
</rule>
尽管如此,作为PMD维护者,我相信这是改变PMD本身规则的合法案例,所以我添加了github.com/pmd/pmd/issues/720来跟踪这个。
答案 1 :(得分:1)
默认情况下,PMD会标记名称少于3个字符的变量,尽管它已经豁免了一些合法的情况,例如for-loop变量。您需要调整PMD,以便它还可以免除lambda表达式中的变量。
这是通过修改PMD的一个名为 naming.xml 的规则集文件之一来完成的,该文件位于jar文件 {pmd installation dir} \ lib \ pmd-java-5.8.1.jar中(如果您使用的是最新版本的PMD)。一种方法如下:
将jar文件 pmd-java-5.8.1.jar 的内容解压缩到某个临时文件夹。
编辑提取的文件 naming.xml 并找到文本规则名称=“ShortVariable”然后插入文本 [not(ancestor ::) LambdaExpression)] ,如下面的粗体所示。
[否(祖先:: ForInit)]
的 [否(祖先:: LambdaExpression)] 强> [not(../../ VariableDeclarator and ../../../LocalVariableDeclaration 和../../../../ ForStatement)]
[not((ancestor :: FormalParameter)and(ancestor :: TryStatement))]
您也可以选择进一步调整规则集文件。
使用修改后的 naming.xml 重新创建jar文件。这个命令可以做到:
jar cf pmd-java-5.8.1.jar net rulesets META-INF
我不知道您拥有的PMD插件的风格和版本,但它们都应该使用 pmd-java-5.8.1.jar 或其早期版本。我只使用PMD本身而不是插件进行了简单的概念验证,并使用此方法从命令行验证了它:
void test() {
Consumer<String> consumer = (String s) -> System.out.println(s);
consumer.accept("Hello world!!!");
}
PMD的5.8.1版报告了该代码中lambda变量的以下违规行为:
但是,如上所述修改 naming.xml 后违规行为已经消失。
答案 2 :(得分:0)
较新的PMD版本现在在命名规则集中使用ShortVariable规则。我在我的ruleset.xml中使用它来使错误消失为lambdas。它仍然捕获短的非lambda变量。
<rule ref="rulesets/java/naming.xml/ShortVariable">
<properties>
<property
name="violationSuppressXPath" value=".[ancestor::LambdaExpression]"/>
</properties>
</rule>