【问题标题】:What is the difference between JDK and JRE?JDK和JRE有什么区别?
【发布时间】:2010-12-26 18:14:37
【问题描述】:

JDK和JRE有什么区别?

他们的角色是什么?我什么时候应该使用其中一个?

【问题讨论】:

标签: java


【解决方案1】:

JREJava 运行时环境。它是运行已编译的 Java 程序所需的一切包,包括 Java 虚拟机 (JVM)、Java 类库、java 命令和其他基础设施。但是,它不能用于创建新程序。

JDKJava 开发工具包,是用于 Java 的全功能 SDK。它拥有 JRE 所拥有的一切,还有编译器 (javac) 和工具(如 javadocjdb)。它能够创建和编译程序。

通常,如果您只关心在计算机上运行 Java 程序,您只会安装 JRE。这就是你所需要的。另一方面,如果您打算进行一些 Java 编程,则需要安装 JDK。

有时,即使您不打算在计算机上进行任何 Java 开发,您仍然需要安装 JDK。例如,如果您使用 JSP 部署 Web 应用程序,从技术上讲,您只是在应用程序服务器中运行 Java 程序。那你为什么需要JDK呢?因为应用服务器会将 JSP 转换为 Java servlet,需要使用 JDK 编译 servlet。我相信还有更多的例子。

【讨论】:

  • 那么当我们使用外部 jars 时,我们将这些 jars 部署在 jre/lib/ext/.. 那为什么呢??
  • 有一些 jars 专门用作 Java 的扩展;这些可以而且应该放在 lib/ext 中。但是放置任何旧的应用程序 jar 并不是这个目录的用途;这是对扩展机制的滥用,可能会在以后引起问题。
  • 我在 JExcel API 上工作过,我已经正确设置了类路径,但问题仍然存在。所以我将它部署在 tlib/ext 文件夹中,之后就可以了??那是什么原因呢??
  • 我没有完全确定的信息,但我的猜测是您没有真正正确设置类路径,或者您为与结束的类加载器不同的类路径设置了类路径使用您的代码。 lib/ext 与类路径扩展的不同之处在于,lib/ext 将影响 任何 使用该特定 JRE 的 java 应用程序 - 它比设置类路径更简单。
  • 几周前,我经历了一个相当大的故障,通过更改我的 JAVA_HOME 和 Path 环境变量以引用 JRE 而不是 JDK 得到了纠正。在什么情况下,应用程序会使用 JRE 运行并使用 JDK 失败?我想我应该提出一个新问题。有趣的是,从 1.6 版开始,JRE 包含在 JDK 安装中,但在与 JDK 文件夹相同的级别解压缩,而在 1.5 版及之前的版本中,JRE 文件夹位于 JDK 中。顺便说一句:很好的答案!
【解决方案2】:

上面的答案(Pablo)是非常正确的。这只是附加信息。

JRE,顾名思义,是一个环境。它基本上是一堆包含 Java 相关文件的目录:

  • bin/ 包含 Java 的可执行程序。最重要的是 java(对于 Windows,javaw 也是如此),它会启动 JVM。这里还有一些其他实用程序,例如keytoolpolicytool
  • conf/ 包含可供 Java 专家使用的用户可编辑配置文件。
  • lib/ 有大量的支持文件:一些.jars、配置文件、属性文件、字体、翻译、证书等——Java 的所有“修饰”。最重要的是modules,该文件包含Java 标准库的.class 文件。
  • 在一定程度上,Java 标准库需要调用本机代码。为此,JRE 在bin/lib/ 下包含一些.dll (Windows) 或.dylib (macOS) 或.so (Linux) 文件,以及支持系统特定的本机二进制代码。

JDK 也是一组目录。它是 JRE 的超集,有一些补充:

  • bin/ 已通过开发工具扩大。其中最重要的是javac;其他包括jarjavadocjshell
  • 已添加包含标准库的 JMOD 文件的 jmods/。这些文件允许标准库与jlink 一起使用。

【讨论】:

  • 这是否意味着我可以将路径变量设置为 JDK,仅此而已?
  • @Brady:是的,我想是的。这对我来说很好,至少。作为开发人员,我基本上忽略了 JRE。如果存在您特别需要 JRE 的特殊情况,我不知道。
  • JRE 只能使用已编译的 Java 代码,对吧?
  • @Cupidvogel,因为 JRE 中没有编译器,我想你可以这么说。 JRE 用于运行(编译)Java 代码,而 JDK 还为您提供开发它的工具。
  • 所以基本上 JDK 包括一个编译器(如 Javac)来编译代码,一个 JRE(运行时系统)来执行编译后的代码,以及其他旨在让程序员的开发生活变得轻松的工具,正确的?所以 AFAIU,这里只有 Javac 和 JRE 才是真正必要的工具。那么,为什么很多时候,软件安装、升级都要求 JDK 存在呢?
【解决方案3】:

来自官方java网站...

JRE(Java 运行时环境):

  • 它是实际执行 Java 程序的 Java 虚拟机* 的实现。
  • Java Runtime Environment是运行java程序所需的插件。
  • JRE 比 JDK 小,因此它需要更少的磁盘空间。
  • JRE 可以从以下网站免费下载/支持 https://www.java.com
  • 它包括 JVM、Core 库和其他附加组件,用于运行用 Java 编写的应用程序和小程序。

JDK(Java 开发工具包)

  • 它是一套软件,可用于开发基于 Java 的应用程序。
  • 开发 Java 应用程序需要 Java 开发工具包。
  • JDK 需要更多磁盘空间,因为它包含 JRE 以及各种开发工具。
  • JDK 可以从以下网站免费下载/支持 https://www.oracle.com/technetwork/java/javase/downloads/
  • 它包括 JRE、一组 API 类、Java 编译器、Webstart 以及编写 Java 小程序和应用程序所需的其他文件。

【讨论】:

    【解决方案4】:

    从调试角度来看的一个区别:

    要调试 Java 系统类,如 String 和 ArrayList,您需要使用“调试信息”编译的特殊版本的 JRE。 JDK 中包含的 JRE 提供了此信息,但常规 JRE 不提供。常规 JRE 不包含此信息以确保更好的性能。

    什么是调试信息?以下是来自this blog post 的快速解释:

    现代编译器可以很好地将您的高级代码,其良好的缩进和嵌套控制结构和任意类型的变量转换成一大堆称为机器码(或 Java 中的字节码)的位,唯一的目的其中是在目标 CPU(JVM 的虚拟 CPU)上尽可能快地运行。 Java 代码被转换成几个机器代码指令。变量被推到所有地方——堆栈、寄存器或完全优化。结果代码中甚至不存在结构和对象——它们只是一种抽象 它被转换为硬编码的偏移量到内存缓冲区中。

    那么当你要求调试器在某个函数的入口处中断时,它是如何知道在哪里停止的呢?当您向它询问变量的值时,它如何设法找到要显示的内容? 答案是——调试信息。

    调试信息由编译器与机器代码一起生成。它是可执行程序与原始源代码之间关系的一种表示。此信息被编码为预定义的格式并与机器代码一起存储。多年来为不同的平台和可执行文件发明了许多这样的格式。

    【讨论】:

      【解决方案5】:

      JDK 是 JRE 的超集,包含 JRE 中的所有内容,以及开发小程序和应用程序所需的编译器和调试器等工具。 JRE 提供库、Java 虚拟机 (JVM) 和其他组件来运行用 Java 编程语言编写的小程序和应用程序。

      【讨论】:

      • 酷图!我有点困惑,java 命令在 JRE 之外被描绘,这是不正确的。我不明白为什么安装JDK时java命令有单独的文件,至少大小相同。在什么情况下,应用程序会使用 JRE 运行并使用 JDK 失败?最近经历过这种情况,可能应该回溯复制并深入了解它......
      【解决方案6】:

      JRE

      JRE是Java Runtime Environment的首字母缩写,用于提供运行时环境,是JVM的实现,物理存在。它包含一组库+JVM在运行时使用的其他文件。

      JDK

      JDK是Java Development Kit的缩写。它是物理存在的。它包含JRE+开发工具。

      链接:- http://www.javatpoint.com/difference-between-jdk-jre-and-jvm

      通常,当您只关心在浏览器或计算机上运行 Java 程序时,您只会安装 JRE。这就是你所需要的。另一方面,如果你打算做一些Java编程,你也需要JDK。

      【讨论】:

        【解决方案7】:

        这是直接来自 Oracle 的简单回复 http://docs.oracle.com/javase/7/docs/technotes/guides/

        Java SE 运行时环境 (JRE)

        JRE 为您提供运行以 Java 编程语言编写的小程序和应用程序所需的库、Java 虚拟机和其他组件。此运行时环境可以与应用程序一起重新分发,以使其独立。

        Java SE 开发工具包 (JDK)

        JDK 包括 JRE 以及命令行开发工具,例如编译器和调试器,这些工具对于开发小程序和应用程序是必要或有用的。

        【讨论】:

        【解决方案8】:

        JVM(Java 虚拟机)是一种抽象机器。它是一种提供运行环境的规范,可以在其中执行java字节码。

        JRE是Java Runtime Environment的首字母缩写,用于提供运行时环境,是JVM的实现,物理存在,包含一组库+JVM在运行时使用的其他文件

        JDK是Java Development Kit的缩写,物理存在,包含JRE+开发工具

        【讨论】:

          【解决方案9】:

          如果您想运行 Java 程序,但不想开发它们,请下载 Java 运行时环境或 JRE。如果您想开发它们,请下载 Java 开发工具包或 JDK

          JDK

          我们称之为 JDK 是一个工具包,其中包括开发和运行 Java 应用程序所需的那些东西。

          JDK 是作为构建应用程序、组件和小程序的开发环境而提供的。

          JRE

          它包含以编译形式运行 Java 应用程序所需的一切。你不需要任何图书馆和其他东西。您需要的所有内容都已编译。

          JRE 不能用于开发,只能用于运行应用程序。

          【讨论】:

            【解决方案10】:

            通俗地说:JDK 是祖父 JRE 是父亲,JVM 是他们的儿子。 [即JDK > JRE > JVM]

            JDK = JRE + 开发/调试工具

            JRE = JVM + Java 包类(如 util、math、lang、awt、swing 等)+运行时库。

            JVM = 类加载器系统 + 运行时数据区 + 执行引擎。

            换句话说,如果您是Java程序员,您的系统中将需要JDK,并且该软件包还将包括JRE和JVM,但是如果您是喜欢玩在线游戏的普通用户,那么您只需要JRE和这个软件包里面不会有 JDK。

            JVM:

            Java 虚拟机 (JVM) 是运行 Java 字节码的虚拟机。 JVM 不理解 Java 源代码,这就是为什么您编译 *.java 文件以获得包含 JVM 可以理解的字节码的 *.class 文件的原因。它也是使 Java 成为“可移植语言”(一次编写,随处运行)的实体。确实有针对不同系统(Windows、Linux、MacOS,参见*列表..)的 JVM 的特定实现,目的是使用相同的字节码,它们都给出相同的结果。

            JDK 和 JRE

            要解释JDK和JRE之间的区别,最好阅读Oracle文档并参考图表:

            Java 运行时环境 (JRE)

            Java 运行时环境 (JRE) 提供库、Java 虚拟机和其他组件来运行用 Java 编程语言编写的小程序和应用程序。此外,JRE 还包含两项关键部署技术:Java 插件,它使小程序能够在流行的浏览器中运行;和 Java Web Start,它通过网络部署独立的应用程序。它也是用于企业软件开发和部署的 Java 2 平台企业版 (J2EE) 技术的基础。 JRE 不包含用于开发小程序和应用程序的工具和实用程序,例如编译器或调试器。

            Java 开发工具包 (JDK)

            JDK 是 JRE 的超集,包含 JRE 中的所有内容,以及开发小程序和应用程序所需的编译器和调试器等工具。

            请注意,Oracle 并不是唯一提供 JDK 的。

            JIT Compile Process (Courtesy: Oracle documentation)

            【讨论】:

            • 当您说“编译”或“编译器”时,在您所指的上下文中非常混乱:将Java源代码转换为Java字节码,或将Java字节码转换为机器码.
            • 不错!我喜欢祖父、父子的比喻。 :D
            • 是的,谢谢,不熟悉这些术语的人很容易理解。
            【解决方案11】:

            jdk 是编译成代码并将 java 代码转换为字节码所必需的,而 jre 是执行字节码所必需的。

            【讨论】:

            • @Noy:它不仅信息很少,而且不包含其他答案所没有的任何内容。
            【解决方案12】:

            JDK 和 JRE 的区别在于,JDK 是 Java 的软件开发工具包,而 JRE 是运行程序的地方。

            【讨论】:

              【解决方案13】:

              假设,如果您是开发人员,那么您的角色是开发程序以及执行程序。所以你必须有JDK提供的开发和执行环境。

              假设,如果您是客户,那么您不必担心开发。您只需要一个运行程序并获得结果的环境,由JRE提供。

              JRE 执行应用程序,但 JVM 逐行读取指令,因此它是解释器。

              JDK=JRE+开发工具

              JRE=JVM+库类

              【讨论】:

                【解决方案14】:

                清楚了解这些术语(JVM、JDK、JRE)对于掌握它们的用法和区别至关重要。

                JVM Java 虚拟机 (JVM) 是执行 Java 字节码的运行时系统。 JVM 就像一台虚拟计算机,可以执行一组编译指令并操纵内存位置。当 Java 编译器编译源代码时,它会在 .class 文件中生成一组高度优化的指令,称为字节码。 JVM 会解释这些字节码指令,并将它们转换为特定于机器的代码以供执行。

                JDK Java Development Kit (JDK) 是一个软件开发环境,可用于开发和执行 Java 应用程序。它包括 JRE 和一组编程工具,例如 Java 编译器、解释器、appletviewer 和文档查看器。 JDK 通过 Java SE、Java EE 或 Java ME 平台实现。

                JRE Java 运行时环境 (JRE) 是 JDK 的一部分,它包括一个 JVM、核心类和几个支持应用程序开发的库。虽然 JRE 作为 JDK 的一部分提供,但您也可以单独下载和使用它。

                如需全面了解,您可以查看我的博客:Jdk Jre Jvm and differences

                【讨论】:

                  【解决方案15】:

                  如果您是 Java 程序员,您的系统中将需要 JDK,此软件包也将包含 JRE 和 JVM,但如果您是 普通用户 喜欢玩网络游戏的,你只需要JRE,这个包里面没有JDK。

                  JVM

                  JVM(Java 虚拟机)是一种抽象机器。它是一个 提供运行时环境的规范,其中 java 字节码 可以执行。

                  JVM 可用于许多硬件和软件平台。 JVM、JRE 和 JDK 是平台相关的,因为每个操作系统的配置 不同。但是,Java 是独立于平台的。

                  JRE

                  它包含在编译后运行 Java 应用程序所需的一切 形式。你不需要任何图书馆和其他东西。你的一切 需要编译。

                  JRE 不能用于开发,只能用于运行 应用程序。

                  Java SE 开发工具包 (JDK)

                  JDK 包括 JRE 以及命令行开发工具,例如 开发所需或有用的编译器和调试器 小程序和应用程序。

                  (来源:GeeksForGeeks Q&AJava Platform Overview

                  【讨论】:

                  • 存在来自多个站点的抄袭(针对 JVM 和 JDK 部分)。下一次,请注明您的出处——这不是您的原创作品。
                  【解决方案16】:

                  JVM、JRE、JDK——这些都是 Java 语言的支柱。每个组件单独工作。 JDK 和 JRE 物理存在,但 JVM 是一个抽象机器,这意味着它实际上并不存在。

                  JVM是JDK和JRE的子系统,用于检查被称为“字节码”的中间代码。它首先通过JVM子系统类加载器加载Java编译器(javac)生成的“类文件”(扩展名为.c),并根据用途分类内存位置(类区、堆栈、堆和pc寄存器)。然后它检查所有字节码以确保它以 Java 和所有内存可访问性访问由网络返回。解释器的工作在它逐行检查整个程序之后开始。结果最终通过JRE(Java Runtime Environment)这些运行时设施显示在控制台/浏览器/应用程序中。

                  JRE也是JDK的一个子系统,提供JVM、类、.jar文件等可执行文件等运行时设施。

                  JDK 代表 Java 开发工具包。它包含Java编程中使用的所有必要组件,例如类,方法,swing,AWT,包,Java(解释器),javac(编译器),appletviewer(小程序应用程序查看器)等。总而言之,它包含开发所需的每个文件应用程序,无论是独立的还是基于 Web 的。

                  【讨论】:

                    【解决方案17】:

                    JDK 包括 JRE 以及命令行开发工具,例如开发小程序和应用程序所必需或有用的编译器和调试器。

                    JRE 基本上是运行 Java 程序的 Java 虚拟机。它还包括用于执行 Applet 的浏览器插件。

                    JDK 是一个抽象机器。它是一种提供运行环境的规范,可以在其中执行 java 字节码。

                    所以,按照@Jaimin Patel 所说,基本上 JVM

                    【讨论】:

                      【解决方案18】:

                      简单地说:

                      JVM 是 Java 代码在其上执行的虚拟机

                      JRE 是运行 Java 应用程序所需的环境(标准库和 JVM)

                      JDK 是带有开发人员工具和文档的 JRE

                      【讨论】:

                        【解决方案19】:

                        JVM、JRE 和 JDK 依赖于平台,因为每个操作系统的配置不​​同。但是,Java 是平台无关的。

                        Java 虚拟机 (JVM) 是执行 Java 字节码的运行时系统。

                        JRE 是运行 Java 应用程序所需的环境(标准库和 JVM)。

                        JDK 包括 JRE 以及命令行开发工具,例如编译器和调试器,这些工具对于开发小程序和应用程序是必要或有用的。

                        【讨论】:

                          【解决方案20】:

                          JRE

                          JRE是Java Runtime Environment的缩写,用来提供运行环境,是JVM的实现。它是物理存在的。它包含一组库和 JVM 在运行时使用的其他文件。

                          除了 Sun Micro Systems 之外,其他公司也积极发布了 JVM 的实现。

                          JDK

                          JDK是Java Development Kit的首字母缩写。它是物理存在的。它包含JRE+开发工具。

                          【讨论】:

                          • 文本和图形中的信息均已在其他较早的答案中提供。