3

使用 1.5 和 1.6 编译的代码会在 1.4 JRE 上运行吗?我们不确定 1.4 JRE 支持哪些 Java 版本。

我们知道,如果有问题的代码实现了 1.5 或 1.6 支持的功能,那么它肯定不会编译......并且“向后编译”存在一些风险,但不确定 1.4 JRE 是否会拒绝加载1.5/1.6 编译类与否。


更新:我确认java.lang.UnsupportedClassVersionError如果您在 JRE 1.4 上运行 1.6 类文件,您会遇到异常。

4

8 回答 8

8

你可以交叉编译。本文档向您展示如何:

http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#crosscomp-example

您必须指定您所针对的特定主要版本(1.4,听起来像)。

使用这种技术,你最好的选择是始终使用你能找到的最新的 javac!这样您就拥有了所有最新的错误修复和性能改进,而且非常安全。

编辑:请注意,这确实解决了库不兼容的问题,这在几个答案中进行了讨论!

于 2009-11-10T20:29:07.683 回答
5

仅当您使用javac -target 1.4switch 编译时。

显然,您将无法使用 1.5+ 的功能,例如泛型、执行器等。

于 2009-11-10T20:28:18.970 回答
4

如果您只是使用默认值javac1.6 构建,您的类文件将无法在旧版本的 Java 上运行。

为较旧的 Java 编译的最佳方法就是使用较旧的 JDK 版本。但是,如果您真的想尝试从较新的 Java 编译较旧的 Java,这里有一些说明:

于 2009-11-10T20:35:27.677 回答
1

您也可能对http://en.wikipedia.org/wiki/Java_backporting_tools感兴趣

于 2009-11-10T20:48:44.227 回答
0

是的,您可以使用 1.6 编译器 (javac) 生成与 1.4 兼容的类文件,但是,仅仅这样做并不一定会生成可以工作的代码。问题是它仍然会针对 1.6 版本的 API 进行编译。

乍一看,你不会认为这是一个问题,因为合同不应该改变,但它是 - 我遇到了一个问题,一个将 IIRC 整数的新构造函数添加到 BigDecimal(在 1.5 中),所以在编译时但是在运行时指定了对该构造函数的调用,该构造函数不存在,因此出现运行时异常。当方法重载并且您依赖自动变量转换时,您可能会遇到这样的问题。

Javac 应用程序实际上独立于它所属的 Java 版本 - 您可以指定不同的 API 以针对 1.6 javac 使用,并且为了避免任何运行时问题,应该这样做。

于 2009-11-11T08:46:47.863 回答
0

我不认为它会。

有时(由于过于复杂而无法解释的原因),我尝试在 1.5 JRE 中运行代码,该 JRE 是在 1.6 JDK 中编译的。它通常会抛出 java.lang.UnsupportedClassVersionError 异常。

于 2009-11-10T20:25:59.483 回答
0

是和不是。如果在编译时将“source”和“target”javac 选项设置为您的目标版本(例如 1.4),您可以在 1.4 jvm 上运行在 Java 6 下编译的代码。这适用于您没有使用自目标版本以来添加的任何其他类或语言功能的情况。

祝你好运。

于 2009-11-10T20:34:01.730 回答
0

Java 1.5 是一个主要版本,它引入了枚举、自动装箱和其他东西。编译时你会得到异常说不支持的类版本。但是如果你使用命令 javac -source 1.4 -target 1._ claasname.java 编译它会编译。

如果您在这种情况下使用 1.5 的功能,如自动装箱和枚举,它将无法编译,因为这些功能在 1.4 中不可用。在这种情况下,我们需要基于一些工具将我们的代码转换为旧版本。

于 2019-08-27T14:08:27.330 回答