我是否可以使用带有较新JDK的ant为较旧的java版本编译java,以便它在编译使用较新API的代码时生成输出?
我只希望在我的系统上安装JDK 8,并让ant javac编译操作为java 6环境创建工作类文件 如果我只在语法上使用符合Java6的代码,但我的代码可以访问Java8API的方法/类,并且根据ant的编译操作仍然符合Java6,那么这种方法就可以工作 甚至在将“javac”任务属性“source”和“target”设置为Java6时也是如此。我知道这会生成以下警告:[javac]警告:[options]引导类路径未与-source 1.6一起设置。但这并不是帮助我检测代码是否实际使用新引入的API元素的警告类型 当正在编译的代码试图利用Java8API引入的方法/类时,我需要编译操作以某种方式执行某些操作 举个例子:如果使用JDK 8(一种继承自引入java 8的父类可执行文件的方法)进行复制,那么使用兼容java 6的代码,我可以访问java.lang.reflect.Constructor.getParameters()。当代码在Java6执行环境中运行时,执行该语句将导致抛出NoSuchMethodException,不可见,因此也未处理。我需要我的ant compile操作生成一些不同类型的输出(暂停、警告或其他),这样我就可以在上面自动化一些东西我是否可以使用带有较新JDK的ant为较旧的java版本编译java,以便它在编译使用较新API的代码时生成输出?,java,ant,compilation,java-8,Java,Ant,Compilation,Java 8,我只希望在我的系统上安装JDK 8,并让ant javac编译操作为java 6环境创建工作类文件 如果我只在语法上使用符合Java6的代码,但我的代码可以访问Java8API的方法/类,并且根据ant的编译操作仍然符合Java6,那么这种方法就可以工作 甚至在将“javac”任务属性“source”和“target”设置为Java6时也是如此。我知道这会生成以下警告:[javac]警告:[options]引导类路径未与-source 1.6一起设置。但这并不是帮助我检测代码是否实际使用新引入的
在这种情况下,是否有与ant相关的解决方案?您必须编码到Java 6 API或找到新库的后台端口以与应用程序打包您必须编码到Java 6 API或找到新库的后台端口以与应用程序打包您是实现Java 6+兼容性的唯一真正选择就是使用Java6编译器。您节省的磁盘空间不值得担心它实际上不会在Java 6上运行。要实现Java 6+兼容性,唯一真正的选择是使用Java 6编译器。您节省的磁盘空间不值得担心它实际上不会在Java 6上运行。您写道: 我知道这会生成以下警告:[javac]警告:[options]引导类路径未与-source 1.6一起设置 这个警告为我们指出了正确的解决方案。除了
-source
和-target
选项外,使用javac
的-bootclasspath
选项指定指向1.6
的rt.jar
的引导类路径。您不必在计算机上安装完整的JDK1.6;包含API类的jar就足够了
甲骨文公司在其网站上发布了一份声明
请注意,这个问题已由解决,希望它能进入Java9版本。然后,将有一个-release
编译器选项,它将-source
、-target
和-bootclasspath
与JDK本身附带的适当文件相结合。因此,您不再需要从较旧的JDK获得rt.jar
。您编写:
我知道这会生成以下警告:[javac]警告:[options]引导类路径未与-source 1.6一起设置
这个警告为我们指出了正确的解决方案。除了-source
和-target
选项外,使用javac
的-bootclasspath
选项指定指向1.6
的rt.jar
的引导类路径。您不必在计算机上安装完整的JDK1.6;包含API类的jar就足够了
甲骨文公司在其网站上发布了一份声明
请注意,这个问题已由解决,希望它能进入Java9版本。然后,将有一个
-release
编译器选项,它将-source
、-target
和-bootclasspath
与JDK本身附带的适当文件相结合。因此,您不再需要从较旧的JDK获得rt.jar
。不。字节码不起作用,因为该方法在早期版本的Java中不存在。“但这不是帮助我检测代码是否实际使用新引入的API元素的警告类型。”事实上,我非常确定它是。警告告诉您在编译时使用Java 6类,这样您就不会无意中调用较新的方法。Java 9将在此处堵塞其中一个漏洞,在为较旧版本编译时检查是否使用较新的API。(还有第三方工具可以检查这一点,比如AnimalSniffer。)@BrianGoetz:很好的解决方案。除非您需要-source 1.8-target 1.8-bootclasspath${1.7}
,就像javac
→ 反lambda→ StreamSupport管道,其中javac
由于LambdaMetafactory
而失败。在这种情况下,最好让API(post)检查*.class
文件而不是.No。字节码不起作用,因为该方法不在早期版本的Java中。“但这不是帮助我检测代码是否实际使用了新引入的API元素的警告类型。”事实上,我非常确定它是。警告告诉您在编译时使用Java 6类,这样您就不会无意中调用较新的方法。Java 9将在此处堵塞其中一个漏洞,在为较旧版本编译时检查是否使用较新的API。(还有第三方工具可以检查这一点,比如AnimalSniffer。)@BrianGoetz:很好的解决方案。除非您需要-source 1.8-target 1.8-bootclasspath${1.7}
,就像javac
→ 反lambda→ StreamSupport管道,其中javac
由于LambdaMetafactory
而失败。在这种情况下,最好让API(后期)检查*.class
文件。@grimmeld我建议您继续