JDK、JRE、Java:版本混淆

26

(注:此问题及其答案来自2011年,展示了当时的世界。)


虽然我还不是一名真正的Java开发人员,但我觉得我应该现在就知道这个问题,但我仍然感到非常困惑。我的问题有两个部分:

  1. 所谓的“Sun JDK”、OpenJDK和GCJ之间有什么区别?

  2. 有时我看到以下每个版本号被使用,都让我很困惑,能否有人帮助我梳理一下?

    • Java 6
    • Java 1.6
    • JDK 6
    • JDK 1.6
    • JRE 1.6
    • JVM 11.0

注意:我理解JDK(Java开发工具包)和Java运行环境之间的区别。但是我对JRE和JVM之间的区别不是特别清楚,尽管我知道JVM是什么/做什么。


仍然让我感到困惑的是,OpenJDK似乎是Oracle的一个重点项目:http://openjdk.java.net/faq/ -- 如果这是真的,为什么Oracle还要继续维护两个独立的JDK版本(OpenJDK、Oracle JDK)呢? - Brian Lacy
5个回答

13
注意:截至2023年,Java世界已经发生了一些变化。OpenJDK现在是几个使用HotSpot JVM的发行版的底层开源代码基础,包括现在商业化的Oracle Java。IBM有一个使用他们的J9 JVM的替代方案。除非你有充分的理由,否则任何OpenJDK发行版都可以。
Java 6和Java 1.6是相同的。最初Java被命名为Java 1.X,但随着时间的推移,Sun的市场营销发现,如果他们去掉了“1.”这部分,它将更好地表明所做的重大改进。第一个这样做的版本是Java 1.5,它被推销为Java 5。
JRE 6是Java 6的消费者发行版。可以从http://java.com轻松下载。
JDK 6是Java 6的开发者发行版。它包含像编译器和对比默认JRE更多文化的支持等工具。需要从http://javasoft.com下载。
JVM 11.0 是 Oracle JRE/JDK 内部的 Java "解释器" 版本(其他供应商使用不同的版本号)。这类似于说 Windows Vista 其实是 Windows 6.0.6001。

12
  1. Sun JDK由Sun制作,OpenJDK是一种竞争的开源实现。GCJ是GNU Java编译器。
  2. Java 6 = Java 1.6,JDK 6 = JDK 1.6。

细节1: http://en.wikipedia.org/wiki/OpenJDK https://stackoverflow.com/questions/1977238/why-should-i-use-the-sun-jdk-over-the-openjdk-or-vice-versa

http://en.wikipedia.org/wiki/GNU_Compiler_for_Java

GCJ与Sun JDK/OpenJDK有什么关系? 据我所知,它们之间没有直接关系。 GCJ是一个独立的项目。 使用其中一个JDK的优点是什么? 如果您重新分发Sun JDK,则可能会出现许可问题。就个人而言,我更信任Sun JDK,因为它更稳定。 OpenJDK不是Sun项目吗? 是和否。它是一个社区项目。


你是唯一回答了两个问题的人,Navi,但我希望能得到更详细的回答。GCJ与Sun JDK/OpenJDK有什么关系?使用其中一个JDK比另一个有哪些优点?OpenJDK不是Sun的项目吗?等等。 - Brian Lacy
谢谢提供的资源,但我仍然困惑为什么Oracle会如此深度参与OpenJDK,如果他们仍然维护自己的专有实现。如果同一家公司在两个项目的开发中都处于核心地位,并且两者都在某种程度上是开放的,那么我们为什么需要一个开源和一个单独的专有实现呢? - Brian Lacy
@Brian 严格来说,这并不是必要的。然而,Sun/Oracle无法完全开源JDK,因为“有一些组件Sun没有权利以源代码形式发布在GPL下”。因此,由于这些依赖关系,出现了一个分支。 - Navi
Sun开始将他们的软件——主要是Solaris和Java——开源以求生存。 - Thorbjørn Ravn Andersen

4
  1. 它们基本上是相同的标准实现,描述了Java虚拟机应该如何工作。
  2. Java版本从1.0到1.4正常进展,当时有个聪明的市场人员想到了将下一个版本称为"Java 5"而不是1.5,但这只会造成困惑,并延续到6(1.6)系列,可能还会持续一段时间。我不知道JVM 11.0可能是什么。(你确定它不是1.1.0吗?我知道这很难说,但谁知道呢。)

JVM和JRE之间的区别。严格来说,JVM只是解释Java字节码的机器,而JRE还包含所有标准类库、资源文件、dlls (sos)等。


3

多年来,Sun公司对其编程语言的命名规则进行了一些更改。最初是jdk1.1等版本。在jdk1.2时,他们决定将其更改为Java 2。因此,您会看到一些有关Java 2的旧书。

然后由于某种神秘原因,它又回到了jdk1.3和jdk1.4。当jdk1.5发布时,他们努力再次更改名称。因此,我们有了Java 5。自从他们决定坚持这个名称以来,你会看到以下版本:

   jdk1.5 = Java 5
   jdk1.6 = Java 6
   jdk1.7 = Java 7

并且(也许)等等。

因此,希望这解释了其中的一部分。在你的问题中,Java6 == Java 1.6 == JDK 6 == JDK 1.6。

至于JVM与JRE。JRE包含JVM以及类库和运行Java程序所需的任何其他工具。JVM只是解释您的字节码并在主机上执行它的程序。


1

注意,GCJ不是认证的JVM。它是Java项目的GNU Classpath,在GNU许可下具有部分Java兼容性。除非您确定它符合您的需求并且您有不能使用其他完整的Java实现的原因,否则应该避免使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接