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

标签 java ant compilation java-8

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

如果我在语法上只使用符合 java 6 的代码,这种方法可行,但我的代码可以访问 java 8 API 的方法/类,并且根据 ant 的编译操作仍然符合 java 6。

即使使用“javac”任务属性“source”和“target”设置为 java 6 时也是如此。我知道这会生成以下警告:[javac] warning: [options] bootstrap class path not与 -source 1.6 一起设置。但这不是帮助我检测我的代码是否实际使用新引入的 API 元素的警告类型。

当正在编译的代码尝试使用 java 8 API 引入的方法/类时,我需要编译操作以某种方式执行某些操作。

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

在这种情况下,是否有适合我的 Ant 相关解决方案?

最佳答案

你写:

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 指向 1.6rt.jar 的类路径。您不必在计算机上安装完整的 JDK 1.6;那个包含 API 类的 jar 就足够了。

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

请注意,此问题由 JEP 247 解决,有望将其纳入 Java 9 版本。然后,将有一个 -release 编译器选项,将 -source-target-bootclasspath 与一个与 JDK 本身一起传送的适当文件。因此,您不再需要从旧版 JDK 获取 rt.jar

关于java - 我可以使用带有较新 JDK 的 ant 为较旧的 Java 版本编译 java,以便它在编译使用较新 API 的代码时生成输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40087200/

相关文章:

java - 在 Playframework 中获取资源作为输入流

java - 为什么我的 ORDS servlet 没有执行,即使我已经遵循了现有的指南?

windows - 将退出代码从 exec 的批处理文件传播回 ant

ant - 在没有 testng.xml 文件的情况下运行 testng

java - 为什么我得到 java.io.FileNotFoundException : http://10. 0.2.2 :4000/products/add when trying to send http request?

ant - 并行运行 JUnit 测试

linux - 编译ffmpeg报告 "libprotokit.a: No such file or directory"

visual-studio-2010 - Visual Studio 2010 未捕获构建时的编译错误

java - 在已编译的 Java 类中保留参数/参数名称

java - 在没有 Java 知识的情况下学习 Clojure