9

假设我有一个使用 Java 1.5 编码的 Java 项目,并且我正在使用更高版本的 Java,但将目标设置为 1.5。

如果代码可以使用后来的 Java 编译和测试,那么我是否可以保证它在实际的 Java 1.5 运行时也能正常工作?

或者我是否需要安装我所依赖的所有 JRE 的一个版本才能确定?

JRE 中的错误会发生什么?如果 1.5 中存在错误,则在 1.6 中已修复。如果我使用目标设置为 1.5 的 Java 1.6,该错误会影响我吗?

在现实情况下,这是我需要关注的问题吗?

4

3 回答 3

9

假设您将 target和 source设置为 1.5,您只需要担心我能想到的三种主要情况:

  • 您正在使用内部com.sun类,它可能已更改或消失(或以某种方式依赖于其他一些内部行为。)

  • 您依赖于在更高版本中修复的错误行为。

  • 您遇到了向后不兼容的更改(很少见,但已知会发生。)

    JRE 中的错误会发生什么?如果 1.5 中存在错误,则在 1.6 中已修复。如果我使用目标设置为 1.5 的 Java 1.6,该错误会影响我吗?

如果错误在库中,那么不会影响您。Target 仅真正规定了您编译的字节码版本,您仍将使用更新后的库。如前所述,请注意,如果您依赖这种错误行为,这可能会导致问题。

如果有故意的向后不兼容的更改,那么我所看到的所有情况都将其呈现为编译时错误而不是运行时错误,因此它们将很容易被发现(并且通常也很容易修复。)

我仍然主张在发布之前对新版本的 JVM 进行测试,但在实践中这通常不是问题,无论如何,根据我的经验。

于 2013-03-05T16:45:01.893 回答
5

所有新的 JRE 实现都是以保持兼容性的方式进行的,所以答案是肯定的。但是,我建议您测试您的应用程序,因为您的项目可能存在非常具体的问题。

于 2013-03-05T16:45:03.913 回答
2

总结一下您的问题:JRE 是否向后兼容,JDK 是否向前兼容?

简短的回答是肯定的。

说明: JDK 不向后兼容。即JDK5代码不能在JVM4上运行,或者JDK6不能在JVM5上运行。

然而,JRE 是向后兼容的,因为通常组织编写一次,执行多次

原因: 随着 JRE 变得越来越复杂,具有更智能的堆管理、垃圾收集、线程处理等,客户倾向于迁移到更新版本的 JVM。

错误
如果您将更高版本的 JVM 与更早的“目标”一起使用,则 JVM 中存在的真正错误将停止这种行为。这是因为target=prev_version并没有真正完全调用以前的 JVM。
它只选择增量并以不同的方式处理代码。但是,如果它是在新 JVM 中有意引入的功能(比如 6),切换到 target=1.5 实际上会回退到 1.5 的行为

希望能在一定程度上澄清你的疑惑。

于 2013-03-05T16:55:50.297 回答