来自Java 11项目的Maven-pmd-plugin的UnsupportedClassVersionError

时间:2018-12-14 15:21:52

标签: java maven pmd

我们正在将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以外,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

实际上,PMD确实关心用于类型解析的编译类。

PMD能够检查变量类型,方法返回类型等,以用于分析。为此,PMD使用编译的类和完整的依赖关系类路径。

您可以通过setting the typeResolution property to false通过插件的配置来禁用此功能,但会被警告,一些规则依赖于此信息,并且在无法使用时会尽最大努力

em>基础,这意味着您将在分析中得到更多的假阳性/阴性。

不使用类型分辨率会严重阻碍PMD的分析质量。