29 May 2018
The PMD team is pleased to announce PMD 6.4.0.
This is a minor release.
PMD is now able to understand local-variable type inference as introduced by Java 10.
Simple type resolution features are available, e.g. the type of the variable
s is inferred
var s = "Java 10";
For some time now PMD has supported Type Resolution, and exposed this functionality to XPath rules for the Java language
typeof function. This function however had a number of shortcomings:
@Imagebut was still required.
In this release we are deprecating
typeof in favor of a simpler
typeIs function, which behaves exactly as the
typeof when given all 3 arguments.
typeIs receives a single parameter, which is the fully qualified name of the class to test against.
So, calls such as:
//ClassOrInterfaceType[typeof(@Image, 'junit.framework.TestCase', 'TestCase')]
can now we expressed much more concisely as:
With this change, we also allow to check against array types by just appending
 to the fully qualified class name.
These can be repeated for arrays of arrays (e.g.
Additionally, we introduce the companion function
typeIsExactly, that receives the same parameters as
but checks for exact type matches, without considering the type hierarchy. That is, the test
typeIsExactly('junit.framework.TestCase') will match only if the context node is an instance of
not if it’s an instance of a subclass of
TestCase. Be aware then, that using that method with abstract types will
The new Java rule
detects hard coded keys used for encryption. It is recommended to store keys outside of the source code.
The new Java rule
finds catch blocks,
that catch different exception but perform the same exception handling and thus can be collapsed into a
multi-catch try statement.
The Java rule JUnit4TestShouldUseTestAnnotation (
has a new parameter “testClassPattern”. It is used to distinguish test classes from other classes and
avoid false positives. By default, any class, that has “Test” in its name, is considered a test class.
The Java rule CommentDefaultAccessModifier (
allows now by default the comment “
/* package */ in addition to “
/* default */. This behavior can
still be adjusted by setting the property
net.sourceforge.pmd.benchmarkhave been deprecated:
TextReport. Their API is not supported anymore and is disconnected from the internals of PMD. Use the newer API based around
TimeTrackerinstead, which can be found in the same package.
net.sourceforge.pmd.lang.java.xpath.TypeOfFunctionhas been deprecated. Use the newer
TypeIsFunctionin the same package.
net.sourceforge.pmd.lang.java.xpath.JavaFunctionshave been deprecated. Use the newer
typeIsmethod in the same class instead..
net.sourceforge.pmd.lang.java.typeresolution.TypeHelper. Use the new
isExactlyNonemethods in the same class instead.
DoNotExtendJavaLangError- Akshat Bahety