Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以使用带有较新JDK的ant为较旧的java版本编译java,以便它在编译使用较新API的代码时生成输出?_Java_Ant_Compilation_Java 8 - Fatal编程技术网

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

我是否可以使用带有较新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一起设置。但这并不是帮助我检测代码是否实际使用新引入的

我只希望在我的系统上安装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操作生成一些不同类型的输出(暂停、警告或其他),这样我就可以在上面自动化一些东西


在这种情况下,是否有与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我建议您继续