为什么 Ant 编译的目标 Java 版本具有未定义方法的 Java 源代码



我在 Ant 中有以下 javac 任务。我的系统环境Java版本是Java 8。

<javac destdir="${destination}" deprecation="on" source="1.6" target="1.6" compiler="modern" verbose="true">

在Java源代码中,我使用了一个需要Java 8的方法。如果我将系统环境中的 Java 版本设置为 Java 7,则 Ant 会抛出错误并且不会编译代码。

为什么当我的 Java 版本为 8 时编译,尽管源字段和目标字段设置为 1.6?

当我运行仅在Java 8中可用的方法时,我得到了一个NoSuchMethodError,这是预期的。

您可以编译具有兼容性的较高版本 f.ex. 1.8 的代码,也可以编译较低版本(例如 1.6(的目标版本的代码。这会将代码转换为与相应版本兼容的字节代码。这样做的原因是能够处理与其他 Java 版本兼容的工件。

这是一个内置的java函数,与ant无关。下面是等效的 java 编译器入侵:

javac -source 1.7 -target 1.5 MyTest.java

-source 定义了 Java 的最低版本,需要 tro 能够编译源代码。满足使用 Java 1.8 时的条件。当使用Java 7时,再次满足条件,因此尝试编译,但由于Java 8特性的使用,它最终失败。

如果你有Java 1.6,那么编译器将立即失败,而不尝试执行编译。

源版本仅指定允许的语言功能。 目标版本仅指定.class文件格式。

--release选项可能会执行您想要的操作。 我没试过。 请参阅 javac 文档。

<javac destdir="${destination}" deprecation="on" release="6" source="1.6" target="1.6" compiler="modern" verbose="true">

除此之外,编译器无法知道在哪个版本中引入了方法。 如果它在编译时可用,则认为它是有效的。

最新更新