使用最新的JRE而不是旧的Java版本,我能保证它能工作吗?

使用最新的JRE而不是旧的Java版本,我能保证它能工作吗?,java,Java,假设我有一个用Java1.5编码的Java项目,我正在使用更高版本的Java,但将目标设置为1.5 如果代码在以后的Java中编译和测试正常,那么我是否可以保证它在实际的Java1.5运行时也能正常工作 或者我需要安装一个我所依赖的所有JRE版本才能确定 JRE中的bug会发生什么?如果在1.5中有一个bug,则在1.6中修复。如果我使用Java1.6,目标设置为1.5,这个bug会影响我吗 在现实场景中,这是我需要考虑的问题吗 假设您将target和source设置为1.5,那么您只需担心我能

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

如果代码在以后的Java中编译和测试正常,那么我是否可以保证它在实际的Java1.5运行时也能正常工作

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

JRE中的bug会发生什么?如果在1.5中有一个bug,则在1.6中修复。如果我使用Java1.6,目标设置为1.5,这个bug会影响我吗


在现实场景中,这是我需要考虑的问题吗

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

  • 您使用的是内部
    com.sun
    类,这些类可能已经更改或消失(或者以某种方式依赖于其他内部行为)

  • 您依赖的是后来版本中修复的bug行为

  • 您遇到了向后不兼容的更改(虽然很少见,但已经知道会发生这种情况)

    JRE中的bug会发生什么?如果在1.5中有一个bug,则在1.6中修复。如果我使用Java1.6,目标设置为1.5,这个bug会影响我吗

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

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


我仍然主张在发布新版本的JVM之前对其进行测试,但根据我的经验,实际上这通常不是一个问题。

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

总结您的问题: JRE向后兼容吗?JDK向前兼容吗

简而言之,答案是肯定的

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

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

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

错误
如果您将更高版本的JVM与更早的“目标”一起使用,JVM中存在的真正错误将停止这种行为。这是因为
target=prev\u version
实际上并不完全调用以前的JVM。
它只拾取增量并以不同的方式处理代码。然而,如果这是在新的JVM中有意引入的特性(比如6),那么切换到target=1.5实际上会回退到beahvior 1.5


希望这能在一定程度上澄清您的疑问。

我遇到了以下问题:java7在现有接口中添加了新方法。即使在将其设置为java6兼容之后,编译器告诉我必须实现缺少的方法(用
@Override
注释它)。这样做之后,java6告诉我它不知道新的覆盖方法。但也许这是日食唯一的问题。。。