【问题标题】:Java Maven build source and targe is not workingJava Maven 构建源和目标不起作用
【发布时间】:2019-10-11 03:53:02
【问题描述】:

我的 PC 上安装了 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 版本,但事实并非如此。谁能帮忙解释一下?

【问题讨论】:

    标签: java maven jvm javac


    【解决方案1】:

    Apache Maven 页面说:

    仅设置 target 选项并不能保证您的代码实际上可以在具有指定版本的 JRE 上运行 (...) 同样,设置 source 选项并不能保证您的代码实际上可以在具有指定版本的 JDK 上编译指定版本

    您可以尝试先直接配置插件(而不是您在 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

    【讨论】:

    • 我不仅仅是设置target,我将sourcetarget 设置为相同的值。尝试直接设置插件,也是同样的问题。不要认为Compiling Sources Using A Different JDK 会起作用,因为根本问题在于javac,将其更改为另一个JDK,它并不能解释为什么我无法使用带有-source 1.7 的JDK 8 进行编译。
    • @GMsoF 我已经编辑了我的答案,请尝试使用分叉编译器的配置并将可执行文件设置为您的 JDK 1.7 路径(根据您的计算机路径更改该行)。
    • @GMsoF 它必须是 javac 的完整路径,例如 YOUR_JAVA_HOME/bin/javac
    • 如果我将路径更改为 JDK 1.7,那么它就像我的示例所示那样工作,它与从 JAVA_HOME 设置它相同。我的问题更多,为什么如果我使用 JDK 1.8 并将编译级别设置为 1.7,它不起作用。通过阅读 Oracle 文档,javac 应该可以按预期工作 docs.oracle.com/en/java/javase/11/tools/…。下面,Maven 也在使用javac
    • source 选项不指示javac 编译具有指定JDK 版本的源文件,它指示javac 检查接受的源代码的版本。另一方面,target 选项可确保生成的类文件与该版本兼容。
    【解决方案2】:

    在搜索了这么多 Java 兼容性帖子后,我发现了发生这种情况的两个可能原因:

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

    2) 这可能是由于 Java 实现返回类型不兼容,当使用 JDK 8 编译为 -source=1.7-target=1.7 时,构建路径(引导类)仍将指向 JDK 8,因此实现Java Map 可能返回导致上述问题的不同类型。 Issue about java 8 backward compatibility: new methods in JDK

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2018-01-14
      • 2016-01-13
      • 1970-01-01
      • 2016-03-15
      • 2015-08-29
      • 2021-06-06
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多