Java Maven 构建源和目标不工作

Java Maven build source and targe is not working

我的电脑上安装了 JDK 7 和 8。

我尝试将 JAVA_HOME 设置为 JDK 8,在 Maven pom 文件中,我设置为 1.7,如下所示:

<properties>
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.source>1.7</maven.compiler.source>
</properties>

我在 maven 构建过程中遇到以下错误:

incomparable types: boolean and java.lang.Object

源代码为:

Map mapData = (LinkedHashMap)it.next();
if(true == mapData.get("isTrueOrFalse")){ // java 8 doesn't allow this, it have to be [true == (boolean)mapData.get("isTrueOrFalse")]
    xxx
}

我无法更改源代码,所以我将 JAVA_HOME 更改为 JDK 7,maven pom 保持为 1.7。然后我就可以通过Maven成功构建了。

我的理解是,通过设置源和目标,它应该允许我编译到较低兼容的 Java 版本,但事实并非如此。谁能帮忙解释一下?

Apache Maven 页面说:

Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version (...) In the same way, setting the source option does not guarantee that your code actually compiles on a JDK with the specified version

您可以先尝试直接配置插件(而不是 pom.xml 上的插件):

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
      <verbose>true</verbose>
      <fork>true</fork>
      <executable><!-- path-to-javac --></executable>
      <compilerVersion>1.7</compilerVersion>
      <source>1.7</source>
      <target>1.7</target>
    </configuration>
  </plugin>
</plugins>

最后,你可以试试Compiling Sources Using A Different JDK

经过多次搜索 Java 兼容性 post,我发现发生这种情况的两个可能原因:

1) 这是 JDK 7 中的错误,它不应该允许 JDK 7 编译它,因为类型不匹配。这个在JDK8中已经固定了,所以即使我们用-source=1.7-target=1.7也是不允许通过的。 JDK 1.7 breaks backward compatibility? (generics)

2) 这可能是由于 Java 实现 return 类型不兼容,而使用 JDK 8 编译为 -source=1.7-target=1.7,构建路径 (bootstrap 类) 仍将指向 JDK 8,因此 Java Map 的实现可能 return 不同的类型导致上述问题。