PMDException异常排查:不支持类文件主版本65及日志获取
问题背景
目标
使用org.apache.maven.plugins的maven-pmd-plugin 3.21.2对项目执行PMD扫描。
已尝试操作
采用如下pom配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.21.2</version> <configuration> <outputDirectory>target/reports/pmd</outputDirectory> </configuration> </plugin>
执行命令:mvn clean install pmd:cpd pmd:pmd
问题
问题100%复现,出现PMD处理错误,调试发现抛出PMDException,根因为java.lang.IllegalArgumentException: Unsupported class file major version 65,完整堆栈信息如下:
net.sourceforge.pmd.PMDException: Error while processing at net.sourceforge.pmd.SourceCodeProcessor.processSourceCodeWithoutCache(SourceCodeProcessor.java:128) at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:100) at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:62) at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:89) at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:30) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 65 at org.objectweb.asm.ClassReader.(ClassReader.java:199) at org.objectweb.asm.ClassReader.(ClassReader.java:180) at org.objectweb.asm.ClassReader.(ClassReader.java:166) at org.objectweb.asm.ClassReader.(ClassReader.java:287) at net.sourceforge.pmd.lang.java.typeresolution.PMDASMClassLoader.getImportedClasses(PMDASMClassLoader.java:118) at net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver.populateClassName(ClassTypeResolver.java:1643) at net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver.visit(ClassTypeResolver.java:216) at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.jjtAccept(ASTCompilationUnit.java:44) at net.sourceforge.pmd.lang.java.typeresolution.TypeResolutionFacade.initializeWith(TypeResolutionFacade.java:21) at net.sourceforge.pmd.lang.java.AbstractJavaHandler$5.start(AbstractJavaHandler.java:121) at net.sourceforge.pmd.SourceCodeProcessor.usesTypeResolution(SourceCodeProcessor.java:178) at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:205) at net.sourceforge.pmd.SourceCodeProcessor.processSourceCodeWithoutCache(SourceCodeProcessor.java:118) ... 10 more
咨询
该PMDException的成因是什么?如何获取更多日志进行排查?
解答
成因分析
- Java版本不兼容:Class文件主版本号65对应Java 21,你使用的maven-pmd-plugin 3.21.2依赖的ASM版本不支持Java 21的Class文件格式。PMD做类型解析时需要ASM读取Class文件,旧版ASM无法识别高版本Java编译出的字节码,因此抛出
Unsupported class file major version异常。 - 插件版本滞后:maven-pmd-plugin 3.21.2发布时Java 21尚未正式推出,该版本插件默认依赖的ASM版本适配范围未覆盖Java 21。
排查与解决建议
1. 获取更多日志的方法
- 执行Maven命令时添加
-X参数开启调试日志,会输出PMD扫描过程中的详细信息,包括加载的Class文件路径、ASM版本、扫描的源代码文件等:mvn clean install pmd:cpd pmd:pmd -X - 在插件配置中增加日志级别设置,在
<configuration>标签内添加:
重新执行命令后,会输出更详细的PMD内部处理日志,便于定位具体触发异常的Class文件。<verbose>true</verbose> <logLevel>DEBUG</logLevel>
2. 解决异常的方案
- 升级maven-pmd-plugin版本:更新到支持Java 21的版本(如3.22.0及以上),新版本插件会依赖适配Java 21的ASM版本。修改pom.xml中的插件版本:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.22.0</version> <!-- 或更高版本 --> <configuration> <outputDirectory>target/reports/pmd</outputDirectory> </configuration> </plugin> - 降级Java编译版本:如果暂时无法升级插件,可将项目的Java编译版本降到插件支持的最高版本(如Java 17,对应主版本号61),修改pom.xml中的maven-compiler-plugin配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

