我们正在将Java 8项目迁移到Java11。JAVA_HOME仍指向Java 8,但是第一个要迁移的项目在Java 11中编译,并且单元测试运行良好。
maven-compiler-plugin和工具链的定义如this question所示。 Maven版本是3.5.0。
我跑步时
mvn verify
我收到以下错误:
Failed to execute goal org.apache.maven.plugins:maven-pmd-plugin:3.11.0:
pmd (pmd) on project <yourproject>:
Execution pmd of goal org.apache.maven.plugins:maven-pmd-plugin:3.11.0:
pmd failed: An API incompatibility was encountered while executing
org.apache.maven.plugins:maven-pmd-plugin:3.11.0:pmd:
java.lang.UnsupportedClassVersionError:
<Yourclass> has been compiled by a more recent version of the Java Runtime
(class file version 55.0), this version of the Java Runtime only recognizes
class file versions up to 52.0 //(indentation added for readability)
我知道这些类是使用Java 11编译的(按预期方式),并且maven在Java 8上运行,因为这就是JAVA_HOME所指向的。但是,为什么会跳到pmd-plugin呢?应该检查源代码,不要管编译的类。
除了将JAVA_HOME设置为11以外,还有其他方法吗?
答案 0 :(得分:0)
实际上,PMD确实关心用于类型解析的编译类。
PMD能够检查变量类型,方法返回类型等,以用于分析。为此,PMD使用编译的类和完整的依赖关系类路径。
您可以通过setting the typeResolution
property to false
通过插件的配置来禁用此功能,但会被警告,一些规则依赖于此信息,并且在无法使用时会尽最大努力
不使用类型分辨率会严重阻碍PMD的分析质量。