编辑备注:这个问题是在2009年提出的,那时候世界还很不同。到了2022年,标准的OpenJDK开源版本只包含JDK。
JDK和JRE有什么区别?
它们的角色是什么,我应该在何时使用其中之一?
编辑备注:这个问题是在2009年提出的,那时候世界还很不同。到了2022年,标准的OpenJDK开源版本只包含JDK。
JDK和JRE有什么区别?
它们的角色是什么,我应该在何时使用其中之一?
java
命令和其他基础设施。但它不能用于创建新的程序。
JDK是Java开发工具包的缩写,是完整功能的Java SDK。它拥有JRE的一切,但也有编译器(javac
)和工具(如javadoc
和jdb
)。它能够创建和编译程序。以上答案(由Pablo提供)非常正确。这只是一些额外的信息。
JRE,顾名思义,是一个环境。基本上它是一堆带有Java相关文件的目录,包括:
bin/
包含Java的可执行程序。最重要的是java
(对于Windows还有javaw
),它启动JVM。这里还有其他一些实用工具,例如keytool
和policytool
。conf/
保存用于Java专家进行编辑的配置文件。lib/
有许多支持性文件:一些.jar
文件、配置文件、属性文件、字体、翻译、证书等等,所有Java的“装饰品”都在这里。最重要的是modules
,这是一个包含Java标准库.class
文件的文件。.dll
(Windows)或.dylib
(macOS)或.so
(Linux)文件,在bin/
或lib/
下具有支持系统特定的本机二进制代码。JDK也是一组目录。它是JRE的超集,带有一些附加功能:
bin/
已扩大了开发工具。其中最重要的是javac
;其他包括jar
、javadoc
和jshell
等。jmods/
,其中包含标准库的JMOD文件。这些文件允许使用jlink
使用标准库。JDK是JRE的超集,包含了JRE中的所有内容以及开发小程序和应用程序所必需的编译器和调试器等工具。JRE提供库、Java虚拟机(JVM)以及其他组件来运行用Java编程语言编写的小程序和应用程序。
/usr/lib/jvm/java-8-openjdk-amd64
),JDK的bin目录中的java
文件只是指向jre目录下bin子目录中的“真正”的java文件的快捷方式。 - undefinedJava运行时环境(JRE)提供库、Java虚拟机和其他组件,以运行使用Java编程语言编写的小程序和应用程序。此外,两个关键部署技术是JRE的一部分:Java插件,使小程序能够在流行的浏览器中运行;以及Java Web Start,用于在网络上部署独立应用程序。它还是Java 2平台企业版(J2EE)技术的基础,用于企业软件开发和部署。JRE不包含用于开发小程序和应用程序的编译器或调试器等工具和实用程序。
Java开发工具包(JDK)
JDK是JRE的超集,并包含了JRE中的所有内容,以及用于开发小程序和应用程序所需的编译器和调试器等工具。
请注意,Oracle并不是唯一提供JDK的公司。
来自Java官网...
JRE (Java运行环境):
JDK (Java开发工具包)
一个与调试相关的区别:
要对Java系统类(如String和ArrayList)进行调试,您需要使用编译有“调试信息”的特殊版本JRE。JDK中包含的JRE提供了此信息,但常规JRE没有。 常规JRE不包含此信息以确保更好的性能。
什么是调试信息?以下是从此博客文章中摘取的简要说明:
现代编译器在将高级代码(具有良好缩进和嵌套控制结构以及任意类型的变量)转换为名为机器代码(或Java字节码)的大堆破解时会做得非常出色,其唯一目的是在目标CPU上尽可能快地运行(JVM虚拟CPU)。 Java代码转换为多个机器代码指令。变量被塞到各处 - 堆栈中,寄存器中或完全进行了优化。结果代码中甚至不存在结构和对象——它们只是一个抽象概念,被转换为内存缓冲区中的硬编码偏移量。
那么,当您要求它在某个函数的入口处中断时,调试器如何知道在哪里停止?当您要求它显示变量的值时,它如何找到要显示的内容? 答案是-调试信息。
编译器与机器代码一起生成调试信息。 它是可执行程序与原始源代码之间关系的表示。 此信息被编码为预定义格式并与机器代码一起存储。 多年来,许多这样的格式已针对不同的平台和可执行文件发明出来。
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应用程序。
以下是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以及命令行开发工具,例如编译器和调试器,这些工具对于开发小应用程序和应用非常必要或有用。
JRE
JRE是Java运行时环境的缩写。它用于提供运行时环境。它是JVM的实现。它在物理上存在。它包含一组库+JVM在运行时使用的其他文件。
JDK
JDK是Java开发工具包的缩写。它在物理上存在。它包含JRE + 开发工具。
链接:http://www.javatpoint.com/difference-between-jdk-jre-and-jvm
通常,当您只关心在浏览器或计算机上运行Java程序时,只需安装JRE。这就是您所需要的。另一方面,如果您计划进行一些Java编程,您还需要JDK。
JVM、JRE和JDK是平台相关的,因为每个操作系统的配置不同。但Java是跨平台的。
Java虚拟机(JVM)是一个运行时系统,用于执行Java字节码。
JRE是运行Java应用程序所需的环境(标准库和JVM)。
JDK包括JRE和命令行开发工具,如编译器和调试器,这些工具对于开发小应用程序和大型应用程序非常必要或有用。