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

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

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

这甚至是使用“javac”任务属性“source”和“target”设置为java 6的情况。我知道这会产生以下警告:[javac]警告:[options] bootstrap类路径未设置为同时与-source 1.6。 但这不是帮助我检测我的代码是否实际使用新引入的API元素的警告类型。

当编译的代码试图利用java 8 API引入的方法/类时,我需要编译动作以某种方式做某事。

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

在这种情况下,我是否有与ant相关的解决方案?

你写:

我知道这会产生以下警告:[javac]警告:[options] bootstrap类路径未与-source 1.6一起设置。

这个警告指出我们正确的解决方案。 除了-source-target选项之外,还可以使用javac-bootclasspath选项指定指向1.6rt.jar的引导类路径。 您不必在计算机上安装完整的JDK 1.6; 那个包含API类的jar就足够了。

Oracle在其网站上提供了进一步编译的进一步说明和选项 。

请注意, JEP 247解决了这个问题,希望它能够进入Java 9版本。 然后,将有一个-release编译器选项,将-source-target-bootclasspath与JDK本身一起提供的相应文件组合在一起。 因此,您不再需要从较旧的JDK获取该rt.jar

您必须编写Java 6 API代码或找回新库的端口以与您的应用程序打包

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