JDK和JRE有什么区别?

1079

编辑备注:这个问题是在2009年提出的,那时候世界还很不同。到了2022年,标准的OpenJDK开源版本只包含JDK。


JDK和JRE有什么区别?

它们的角色是什么,我应该在何时使用其中之一?


13
这个问题可以在以下网址找到简明扼要的答案: http://www.java.com/zh_CN/download/faq/techinfo.xml - Akshay Lokur
7
可能是What is the difference between JVM, JDK, JRE & OpenJDK?的重复内容。 - kenorb
10
根据时间戳,这个链接的问题似乎是与这个重复。 - Ungeheuer
20个回答

1406
JREJava Runtime Environment的缩写,它是一个运行已编译好的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。我相信还有更多的例子。

2
有一些 JAR 文件专门用作 Java 扩展,这些文件可以并且应该放在 lib/ext 目录下。但是把任何旧的应用程序 JAR 文件放在这个目录下都不是它的设计目的;这是滥用扩展机制,可能会在以后造成问题。 - Carl Smotricz
3
我没有足够的信息可以完全确定,但我猜想要么你没有正确地设置类路径,要么你为不同于最终使用你的代码的类加载器设置了类路径。lib/ext与类路径扩展的区别在于,lib/ext将影响使用特定JRE的任何Java应用程序 - 它比设置类路径更加可靠。 - Carl Smotricz
几周前,我遇到了一个相当严重的故障,通过更改我的JAVA_HOME和Path环境变量以引用JRE而不是JDK进行了纠正。在什么情况下,应用程序使用JRE运行并使用JDK失败?我想我应该开一个新问题。有趣的是,从1.6版本开始,JRE已包含在JDK安装中,但解压到与JDK文件夹相同的级别,而在1.5版本及之前,JRE文件夹位于JDK内部。顺便说一句:好答案! - Jesse Ivy
那么,当Java安装程序告诉我有更新并且它是最新的JRE时,我可以忽略该更新并下载最新版本的JDK,这样我就拥有了所有最新的Java东西? - Ungeheuer
另一个需要JDK隐式支持的例子是从源代码编译应用程序。用户可能不会直接与JDK交互,但底层构建系统(如cmake、msbuild、make等)可能需要JDK来构建项目。 - dmytro.poliarush
显示剩余4条评论

166

以上答案(由Pablo提供)非常正确。这只是一些额外的信息。

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

  • bin/ 包含Java的可执行程序。最重要的是java(对于Windows还有javaw),它启动JVM。这里还有其他一些实用工具,例如keytoolpolicytool
  • conf/ 保存用于Java专家进行编辑的配置文件。
  • lib/ 有许多支持性文件:一些.jar文件、配置文件、属性文件、字体、翻译、证书等等,所有Java的“装饰品”都在这里。最重要的是modules,这是一个包含Java标准库.class文件的文件。
  • 在某个级别上,Java标准库需要调用本地代码。为此,JRE包含了一些.dll(Windows)或.dylib(macOS)或.so(Linux)文件,在bin/lib/下具有支持系统特定的本机二进制代码。

JDK也是一组目录。它是JRE的超集,带有一些附加功能:

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

1
这是否意味着我可以将我的路径变量设置为JDK,然后就可以了? - Brady
4
@Brady:是的,我认为是这样。对我来说,这很好用。作为一名开发人员,我基本上忽略JRE。如果有特殊情况需要使用JRE,我不知道。 - Carl Smotricz
2
@Cupidvogel,既然JRE没有编译器,那么你可能可以这么说。 JRE用于运行(已编译的)Java代码,而JDK还提供了开发工具。 - Carl Smotricz
1
基本上,JDK 包括一个编译器(如 Javac)来编译代码,一个 JRE(运行时系统)来执行已编译的代码,以及其他旨在使程序员在开发中更轻松的工具,对吗?因此,据我所知,只有 Javac 和 JRE 是真正必要的工具。那么,为什么很多时候软件安装和升级都坚持需要 JDK 存在呢? - SexyBeast
@Darryl,抱歉回复晚了!我有一些建议,但它们都没有经过测试。从最简单(如果可行)到最难,以下是要尝试的事情:(1)编写一个bash脚本,在其中设置并导出JAVA_HOME为您的1.6 jdk的位置,并从中调用CS4。(2)而不是设置JAVA_HOME,请编写一个脚本以重新排列您的PATH,使jdk 1.6 /bin目录在您的1.8位置之前,因此“java”将调用1.6而不是1.8。如果任何一种方法从bash脚本中起作用,那么您可以构建一个图标来调用该脚本,以便从GUI shell中为您调用。 - Carl Smotricz
显示剩余3条评论

154

在这里输入图片描述

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


6
很棒的图表!我有点困惑,为什么java命令被描绘在JRE之外,这是不正确的。当安装了JDK且大小相同时,我不明白为什么会有单独的java命令文件。在什么情况下,应用程序会使用JRE并在使用JDK时失败?最近遇到了这种情况,可能需要回溯以复制并找到问题的根源... - Jesse Ivy
@JesseIvy 我刚刚检查了我的JDK目录(/usr/lib/jvm/java-8-openjdk-amd64),JDK的bin目录中的java文件只是指向jre目录下bin子目录中的“真正”的java文件的快捷方式。 - undefined

134
通俗易懂地说: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源代码,因此您需要编译*.java文件以获取包含JVM可理解字节码的*.class文件。JVM也是使Java成为“可移植语言”(一次编写,多处运行)的实体。确实,有特定于不同系统(Windows、Linux、MacOS等)的JVM实现,目的是使用相同的字节码它们都能给出相同的结果。 要解释JDK和JRE之间的区别,最好阅读Oracle文档并查看图表: Java Runtime Environment (JRE)

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

Java开发工具包(JDK)

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

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

JIT编译过程(由Oracle文档提供)

JDK > JRE > JVM

输入图像描述此处


当你说“编译”或“编译器”时,在这种情况下,你指的是将Java源代码转换为Java字节码,还是将Java字节码转换为机器码,这非常令人困惑。 - JoseOrtiz3
2
不错!我喜欢祖父,父亲和儿子的比喻。 :D - Emzor
谢谢,对于不太熟悉这些术语的人来说,这很容易理解。 - Jaimin Patel
1
@JoseOrtiz3:在Java中,未经限定的术语“编译”通常意味着“将源代码转换为字节码”。“JIT(即时编译)编译”通常意味着“将字节码转换为机器码”。它被称为“即时”,因为它是由JVM在程序运行时执行的。 - Lii

26

来自Java官网...

JRE (Java运行环境):

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

JDK (Java开发工具包)

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

26

一个与调试相关的区别:

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

什么是调试信息?以下是从此博客文章中摘取的简要说明:

现代编译器在将高级代码(具有良好缩进和嵌套控制结构以及任意类型的变量)转换为名为机器代码(或Java字节码)的大堆破解时会做得非常出色,其唯一目的是在目标CPU上尽可能快地运行(JVM虚拟CPU)。 Java代码转换为多个机器代码指令。变量被塞到各处 - 堆栈中,寄存器中或完全进行了优化。结果代码中甚至不存在结构和对象——它们只是一个抽象概念,被转换为内存缓冲区中的硬编码偏移量。

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

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


11

JVM、JRE和JDK是Java语言的支柱,每个组件都独立工作。JDK和JRE实体存在,但JVM是一台抽象机器,这意味着它不存在。

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

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

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


9

以下是Oracle官方简单的回应,http://docs.oracle.com/javase/7/docs/technotes/guides/

Java SE Runtime Environment (JRE)

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

Java SE Development Kit (JDK)

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


“SE” 代表什么?标准版? - Sam Sirry
1
@SamSirry:是的,我也这么认为。维基百科在这里说了:https://en.wikipedia.org/wiki/Java_Platform,_Standard_Edition - kevinarpe

8

JRE

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

JDK

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

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

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


8

JVM、JRE和JDK是平台相关的,因为每个操作系统的配置不同。但Java是跨平台的。

Java虚拟机(JVM)是一个运行时系统,用于执行Java字节码。

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

JDK包括JRE和命令行开发工具,如编译器和调试器,这些工具对于开发小应用程序和大型应用程序非常必要或有用。


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