应用升级至Java 21时Maven PMD Plugin兼容性问题咨询
问题背景
升级应用到Java 21后,使用3.19.0版本的maven-pmd-plugin执行mvn clean install时触发报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-pmd-plugin:3.19.0:pmd (pmd) on project domain: Execution pmd of goal org.apache.maven.plugins:maven-pmd-plugin:3.19.0:pmd failed: org.apache.maven.reporting.MavenReportException: Unsupported targetJdk value '21'
原因是该版本插件仅支持到Java 20,不兼容Java 21的targetJdk配置。
以下是几种可行的解决/规避方案:
方案1:升级插件到支持Java 21的版本
这是最彻底的解决方式,maven-pmd-plugin 3.20.0及以上版本已原生支持Java 21。直接修改插件版本即可:
修改后的插件配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.20.0</version> <!-- 替换为支持Java21的版本 --> <executions> <execution> <id>pmd</id> <phase>verify</phase> <goals> <goal>pmd</goal> </goals> </execution> <execution> <id>pmd-check</id> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> <execution> <id>cpd</id> <phase>verify</phase> <goals> <goal>cpd</goal> </goals> </execution> <execution> <id>cpd-check</id> <phase>verify</phase> <goals> <goal>cpd-check</goal> </goals> </execution> </executions> <configuration> <targetJdk>21</targetJdk> <printFailingErrors>true</printFailingErrors> <minimumTokens>40</minimumTokens> <minimumPriority>0</minimumPriority> <linkXRef>false</linkXRef> <rulesets> <ruleset>${pmd.ruleset.relative.path}</ruleset> </rulesets> <excludeRoots> <excludeRoot>target/generated-sources</excludeRoot> </excludeRoots> </configuration> </plugin>
升级后插件能正常识别Java 21语法,同时保留原有的代码检查规则。
方案2:临时降级targetJdk配置(过渡方案)
如果暂时无法升级插件,可以将配置里的<targetJdk>21</targetJdk>改为<targetJdk>20</targetJdk>。这样插件会以Java 20的规则检查代码,规避兼容性报错。
注意:这种方式无法覆盖Java 21新增的语法特性(比如虚拟线程、模式匹配增强等),可能会遗漏相关代码问题,仅适合短期过渡,后续仍需升级插件。
方案3:临时跳过PMD检查(应急方案)
若需要快速完成Java 21升级,可临时跳过PMD的代码检查:
- 执行Maven命令时添加跳过参数:
mvn clean install -Dpmd.skip=true -Dcpd.skip=true
- 或者在插件配置中添加跳过开关(不推荐长期使用):
<configuration> <!-- 保留原有其他配置 --> <skip>true</skip> <cpdSkip>true</cpdSkip> </configuration>
此方式会完全失去PMD的代码质量检查保障,仅适合紧急升级场景,后续必须恢复插件的正常使用。
内容的提问来源于stack exchange,提问作者RagaSGNur

