我可以使用带有较新 JDK 的 ant 为旧 Java 版本编译 java,以便它在编译使用较新 API 的代码时生成输出吗?

Can i compile java for an older Java version with ant with a newer JDK so it generates output when it compiles code that uses the newer API?

我只想在我的系统上安装 JDK 8,并让 ant javac 编译操作为 java 6 创建工作 class 文件环境。

如果我在语法上只使用 java 6 兼容代码,这种方法可行,但我的代码可以访问 java 8 API 的 methods/classes 并且仍然是 java 6 符合ant的编译动作。

甚至在使用 "javac" 任务属性 "source" 和 "target" 设置为 java 时也是如此 6. 我知道这会生成以下警告: [javac] 警告:[选项] bootstrap class 路径未与 -source 1.6 一起设置。但这不是帮助我检测我的代码是否实际使用新引入的 API 元素的警告类型。

当正在编译的代码尝试使用 java 8 API 引入的 methods/classes.

时,我需要编译操作以某种方式执行某些操作

例如:使用 java 6 兼容代码,如果使用 JDK 8 进行编译,我可以访问 java.lang.reflect.Constructor.getParameters(),这是从 Java 继承的方法8 引入父级 class 可执行。当代码在 java 6 执行环境中运行时,执行该语句将导致抛出 NoSuchMethodException,这是不可预见的,因此也无法处理。我需要我的 ant 编译操作生成一些不同类型的输出(暂停或警告或其他),以便我可以自动执行某些操作。

对于我这种情况,有蚂蚁相关的解决方案吗?

您要么必须编码为 Java 6 API,要么找到新库的反向端口以与您的应用程序打包

Java 6+ 兼容性的唯一真正选择是使用 Java 6 编译器。您保存的磁盘 space 不值得担心它实际上 运行 Java 6.

你写:

I am aware that this generates the following warning: [javac] warning: [options] bootstrap class path not set in conjunction with -source 1.6.

此警告为我们指明了正确的解决方案。除了 -source-target 选项之外,使用 javac-bootclasspath 选项指定 bootstrap class 路径指向 [= 1.6 的 14=]。您不必在计算机上安装完整的 JDK 1.6;那个包含 API classes 的罐子就足够了。

Oracle 在其网站上有 further instructions and options for cross-compiling

请注意,此问题已由 JEP 247 解决,有望将其纳入 Java 9 版本。然后,将有一个 -release 编译器选项,将 -source-target-bootclasspath 与 JDK 本身附带的适当文件组合在一起。所以你不需要再从旧的 JDK 那里得到 rt.jar