Table of Contents

2026-??-?? - 7.27.0-SNAPSHOT

The PMD team is pleased to announce PMD 7.27.0-SNAPSHOT.

This is a minor release.

🚀️ New and noteworthy

Updated Apex Support

The Apex language support has been bumped to version 67.0 (Summer ‘26). It supports the new Multiline String literals.

Kotlin type-aware analysis

Kotlin now supports type-aware analysis via the auxClasspath language property (see #6677). Resolved type names, return types, and annotation FQNs are available through KotlinNodeTypeData for use in Java-based rules.

Note: Type data is not yet accessible in XPath rules or the PMD Rule Designer. This will be added in the next version.

🌟️ New and Changed Rules

Renamed Rules

  • The rule InstantiableUtilityClass (Java Design) was renamed from UseUtilityClass to better reflect the problem. The old name still works but is deprecated.

🐛️ Fixed Issues

  • apex
    • #6478: [apex] Parser error when using CALENDAR_YEAR() in SOQL
    • #6887: [apex] ParseException on Summer ‘26 multiline string literals (‘'’…’’’)
  • chore
    • #6837: chore: Input ‘app-id’ has been deprecated with message: Use ‘client-id’ instead
  • core
    • #1995: [core] PMD should display number of rules violated or errors found
    • #4952: [doc] Improve doc around PMDConfiguration#prependAuxclasspath #setClassloader
    • #4953: [core] Deprecate PMDConfiguration#setClassloader and #getClassloader
    • #6865: [core] Include the running PMD version in the “Unable to find referenced rule” error
  • java
    • #5041: [java] Parsing failed in ParseLock#doParse(): IndexOutOfBoundsException
    • #6768: [java] Disambiguation IllegalStateException resolving a synthesized record accessor used as a call argument alongside an anonymous class
  • java-bestpractices
    • #5514: [java] ExhaustiveSwitchHasDefault fails for non-exhaustive switch statements
    • #5670: [java] ExhaustiveSwitchHasDefault issue with final fields not initialized in constructor
  • java-codestyle
    • #6709: [java] LambdaCanBeMethodReference: False positive with array creation containing constructor call in receiver
  • java-design
    • #6714: [java] Rename UseUtilityClass to InstantiableUtilityClass
    • #6844: [java] AvoidThrowingNewInstanceOfSameException: message inconsistent with logic
  • java-errorprone
    • #6826: [java] AssertEqualsArgumentOrder: False positive for double assertEquals
  • kotlin
    • #6795: [kotlin] Add kotlin-type-mapper infrastructure
    • #6891: [kotlin] AnnotationFqnAnnotator: @TypeName not set on UnescapedAnnotation nodes

🚨️ API Changes

Deprecations

Experimental API

  • kotlin
    • KotlinNodeTypeData: Provides the initial API to access type information on Kotlin AST nodes. It’s part of the new Kotlin type-aware analysis.

✨️ Merged pull requests

📦️ Dependency updates

📈️ Stats