较新的JRE版本可以运行用较旧的JDK版本编译的Java程序吗?


78

这可能是一个愚蠢的问题,但是在运行以Java版本1.61.7编译的Java程序和相关库(我使用1.7进行编译,而某些库使用1.6进行编译)以及在1.7 JRE中运行整个程序时,我会遇到任何问题?

Answers:


84

您不会遇到任何问题-这就是Java的魔力-它向后兼容。您可以在Java 8上运行Java 1的几乎所有代码。没有理由为什么Java 6代码不能在Java 8 Runtime上运行。

有趣的是,对于用Java 1.4编写的应用程序,在以后的运行时运行它们甚至可以提高速度。这是因为Java一直在不断发展,不仅是被称为“ Java”的语言,而且还是JVM(Java虚拟机)。正如最新的JVM所期望的那样,我仍然可以使用10多年前的源代码。

假设要定位Java 5 VM,则可以使用Java 8 SDK工具来实现。只要记住第5版VM可能不支持第8版VM的所有功能,就可以最终指定希望支持的目标VM。

我刚刚针对新的Java 8运行时测试了用Java 5写的代码,并且一切都按预期运行,因此,即使我们现在拥有更强大的语言和运行时,我们仍可以继续使用过去的投资。仅此一项就使Java成为公司的绝佳开发选择。


因此,即使我的程序(我正在使用的某些库)的一半使用1.6编译,而另一半使用1.7编译,它仍然可以工作吗?
肖恩2012年

2
如果在Java 7运行时中运行它,则可以。没有理由不起作用。
埃瓦尔德

1
如果您使用JDK 7开发并将该应用程序编译为JDK 7应用程序,则不会,它在较旧的运行时中将无法正常工作。有很多原因要求用户升级到最新的运行时,主要是出于安全原因,还有一些性能问题。如果可以的话,我会选择Java 7,除非确实需要,否则支持较旧版本没有什么意义。
Ewald

1
-1 MagicDraw在Java的较新版本上不起作用,即使comanpany也制作了降级教程nomagic.com/files/Java%20downgrade%20tutorial.pdf
NeDark,2015年

3
您是否看到有关“可以在Java 8上运行Java 1的几乎所有代码”的内容?有一些小的不兼容性,主要是在JVM的深奥部分。总体而言,Java仍然保持非常向后兼容。
Ewald 2015年

95

前面已经回答了你的大部分安全和产品和3党库将简单的工作。但是,确实存在非常罕见的情况,即在JDK版本之间引入了二进制不兼容使用旧JDK编译的类文件将无法在较新的JVM中运行的二进制文件不兼容)。

Oracle Java版本之间不兼容的正式列表:

相容性工具

JDK 9打包在一起,有一个名为jdeprscan的工具,它将验证兼容性,在代码中列出不再使用的API并建议替代方法(!)。您可以指定目标JDK版本(作品JDK 9876),它会列出不兼容特定于您的目标版本。

对于库的附加注释:

一个合理的经验法则是将库的最新稳定发行版用于您的软件所针对的JRE版本。显然,您会从此规则中发现许多例外,但通常来说,公共库的稳定性通常会随着时间而增加。

自然,在更改依赖版本时,必须考虑API兼容性版本控制

再次,最流行的依赖项将包含应该提供此类信息的网页。

但是,如果您使用的方法更加晦涩难懂,则可以确定依赖项中针对哪些JRE类进行了编译。

这是有关如何查找类版本的好答案。您可能需要先解压缩JAR文件。


12
实际上,这应该是正确的答案,因为升级到较新的Java版本并不完全安全。
dehlen

如果不使用任何jdk8功能,则编译1.8并定位到1.8。能行吗
加拉夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.