使用1.5和1.6编译的代码是否会在1.4 JRE上运行?我们不确定1.4 JRE支持哪些Java版本。
我们知道,如果有问题的代码实现1.5或1.6支持的功能,那么肯定won't compile ...并且有一些risks带有“向后编译”但不确定是否1.4 JRE甚至拒绝加载1.5 / 1.6编译类。
更新:如果您在JRE 1.4上运行1.6类文件,我确认您收到java.lang.UnsupportedClassVersionError
个异常。
答案 0 :(得分:8)
您可以交叉编译。本文档向您展示了如何:
http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#crosscomp-example
您必须指定您要定位的特定主要版本(1.4,听起来像)。
使用这种技术,您最好的选择是始终使用您能找到的最新javac!通过这种方式,您可以获得所有最新的错误修复和性能改进,而且非常安全。
编辑:请注意,这确实解决了库不兼容问题,这在几个答案中已经讨论过了!
答案 1 :(得分:5)
只有使用javac -target 1.4
开关进行编译。
显然,您将无法使用1.5+功能,例如Generics,Executors等。
答案 2 :(得分:4)
如果您只使用默认值javac
1.6进行构建,那么您的类文件将无法在旧版本的Java上运行。
编译旧Java的最佳方法就是使用older JDK releases。但是如果你真的想尝试从较新的Java编译,那么这里有一些说明:
答案 3 :(得分:1)
答案 4 :(得分:0)
我认为不会。
偶尔(由于原因太复杂而无法解释),我尝试在1.5 JRE中运行代码,我在1.6 JDK中编译。它通常会抛出java.lang.UnsupportedClassVersionError异常。
答案 5 :(得分:0)
是和否。如果在编译时将“源”和“目标”javac选项设置为您要定位的版本(例如1.4),则可以在1.4 jvm上运行在Java 6下编译的代码。这适用于您未使用自目标版本以来添加的任何其他类或语言功能的情况。
祝你好运。答案 6 :(得分:0)
是的,您可以使用1.6编译器(javac)生成与1.4兼容的类文件,但是,这样做不一定会产生可行的代码。问题是,仍然会针对1.6版本的API进行编译。
乍一看,你不会指望这是一个问题,因为合同不应该改变,但它是 - 我有一个问题,一个新的构造函数,将IIRC一个整数添加到BigDecimal(在1.5),所以在编译时指定了对该构造函数的调用,但是在运行时,构造函数不存在,因此是运行时异常。当方法过载并且您依赖于自动变量转换时,您可能会遇到类似的问题。
Javac应用程序实际上独立于它所属的Java版本 - 您可以指定一个不同的API来对抗1.6 javac,并且为了避免任何运行时问题,应该这样做。
答案 7 :(得分:0)
Java 1.5是一个主要版本,其中引入了枚举,自动装箱等内容。在编译时,您会得到异常提示,说明不支持的类版本。但是,如果您使用命令javac -source 1.4 -target 1._ claasname.java进行编译,将编译。
如果在这种情况下使用自动装箱和枚举之类的1.5功能,由于这些功能在1.4中不可用,因此它将无法编译。在这种情况下,我们需要根据某些工具将代码转换为旧版本。 / p>