码迷,mamicode.com
首页 > 其他好文 > 详细

jdk中的jre和jre有什么区别?

时间:2019-09-06 22:53:44      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:也有   使用场景   错误   代码   有一个   程序   cli   理由   编译   

jdk 和 jre 是什么? 有什么区别?

  • jre
    Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦,还有所有java类库的class文件,都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢?学过MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。

  • jdk
    Jdk 是java development kit,是java的开发工具包, 主要是给ide 用的,里面包含了各种类库和工具。当然也包括了另外一个Jre., 而且jdk/jre/bin 里面也有一个server文件夹, server文件夹下面也有一个jvm.dll 虚拟机。

为什么默认安装的情况下, 有两个jre呢

我们做了以下几个小实验:

1. 对比文件夹内容

使用 [winMerge]{https://winmerge.org/ "winMerge 下载"} 软件对两个jre 文件夹进行对比($JAVA_HOME$\jdk1.8\jre?和 $JAVA_HOME$\jre1.8), 结果如下:
技术图片

可以看到,两个文件夹中的文件结构和命名绝大部分是相同的,可以推断这两个jre 文件夹是可以相互替换的。故在功能上,其实是可以相互替换的。

2. 在命令行环境下(模拟用户使用)

使用javac 命令 编译一个 Test.class 输出 hello world 的。(为什么不用考虑javac? 因为javac 不是jre 中的, 不在讨论范围内):
将$JAVA_HOME$\jdk1.8\jre?这个文件夹剪切到其它的地方,命令行输入java Test, 输出正常:
技术图片

将$JAVA_HOME$\jre1.8?这个文件夹剪切到其它的地方,命令行输入java Test, 输出错误:
技术图片

说明命令行这种用户使用场景下,JVM是$JAVA_HOME$\jre1.8?里面的虚拟机环境。

那有人可能要问了, 自己明明没有将$JAVA_HOME$\jre1.8?加到环境变量里面去, 为什么会使用这里面的JVM?
我们看到
原因是:在安装jre 的时候,安装程序自动在$System32$\java?(我的电脑里面是C:\Program Files (x86)\Common Files\Oracle\Java\javapath) 路径加到Path 的最上面, 在$JAVA_HOME$\jdk1.8\bin\前面, 而且在以上目录下有java.exe 文件,这个文件应该是一个wrapper, 而目的是为了让使用者免于输入太长的指命。Java.exe的工作就是找到合适的JRE来运行Java程序。 Java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] , 查询注册表之后,发现以上键值 是和$JAVA_HOME$\jre1.8\一致的。

说明在用户级别使用java虚拟机去运行jar 等程序时, 默认使用过的是单独安装的jre, 即$JAVA_HOME$\jre1.8

  1. Intellij 使用环境下 (模拟一般IDE 开发使用)
    将$JAVA_HOME$\jdk1.8\jre (即jdk集成的jre) 文件夹剪切到其它地方之后,用Intellij 打开之前一切正常的工程,发现
    技术图片
    报错 Cannot resolve symbol ‘Stack‘

将$JAVA_HOME$\jre1.8?移除, 保留$JAVA_HOME$jdk1.8\jre?则 IDE 一切正常。、

这说明 想Intellij 这样的开发环境下,对代码的纠错,预运行等需要使用 $JAVA_HOME$\jdk1.8\jre?这样jdk 中集成的jre

综述

根据以上的小实验结果,我们有理由相信:

  • $JAVA_HOME$\jre1.8?这样单独安装的jre 是给普通用户,和其它大多数的一般应用程序使用的java运行环境。
  • $JAVA_HOME$\jdk1.8\jre?这样集成在jdk 中的jre 是给IDE 开发环境使用的。

jdk中的jre和jre有什么区别?

标签:也有   使用场景   错误   代码   有一个   程序   cli   理由   编译   

原文地址:https://www.cnblogs.com/huangzp1104/p/11475143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!