Java核心(一):JDK和JRE、PATH和CLASSPATH的区别
一、JDK和JRE的区别
1 、JDK中,各个文件目录的作用:
- bin目录:存放JDK用于开发的一些终端命令工具。 常见的工具如:“javac”的作用是将java源文件编译为class文件(即字解码文件); “java”命令的作用是运行class文件。
- db目录:是java开发的一个开源的关系型数据库;
- include目录:是一些C语言的头文件;
- jre目录:JDK所依赖的java运行时;
- lib目录:存放JDK开发工具所依赖的一些库文件;
- man目录:存放JDK开发工具的说明文档。
2、JDK和JRE的区别
- JDK是java开发核心组件,是用来编译解释java程序的核心组件,包含java compile(javac) 面向的是java开发人员。
- JRE是java运行环境,用来支持java程序的运行,主要包含的是JVM,面向的是java程序。Java是一种跨平台语言,一次编译,多次在多台电脑上运行,这种机制主要依靠JVM实现。java程序编译得到的是中间字节码,中间字节码是不能再机器上直接运行的,必须要经过JVM把中间字节码转换为机器语言。
- 在开发过程中配置环境变量时,PATH和CLASSPATH的配置都是针对JDK的,可以配置为:
JAVA_HOME=“JDK安装的根目录"
PATH=“.;%JAVA_HOME%/bin" CLASSPATH=".;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar"
二、PATH和CLASSPATH的区别
- PATH是操作系统所有可执行程序的路径;
- classpath变量的含义是告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件,
- path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行Java文件,但必须把完整的路径写出来,如C:\Java\jdk1.7\bin\javac HelloWorld.java。path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径;而java的各种操作命令是在其安装路径中的bin目录下。所以在path中设置了JDK的安装目录后就不用再把java文件的完整路径写出来了,它会自动去path中设置的路径中去找;
- classpath是指定你在程序中所使用的类(.class)文件所在的位置,就如在引入一个类时:import javax.swing.JTable这句话是告诉编译器要引入javax.swing这个包下的JTable类,而classpath就是告诉编译器该到哪里去找到这个类(前提是你在classpath中设置了这个类的路径)。如果你想要编译在当前目录下找,就加上“.”,如:.;C:\Java\jdk1.7\,这样编译器就会到当前目录和C:\Java\jdk1.7\去找javax.swing.JTable这个类;还提下:大多数人都是用Eclipse写程序,不设classpath也没关系,因为Eclipse有相关的配置;
三、CLASSPATH中配置的tools.jar和dt.jar的作用
1、tools.jar、dt.jar的作用
- tools.jar是关于一些JDK工具的类库,它跟我们程序中用到的基础类库(java.*、javax.*)没有关系。tools.jar主要是为jdk的工具,包括javac,java,javadoc,javap等工具,提供所要用到的类库。用压缩软件打开tools.jar,你会发现有很多文件是和bin目录下的exe工具相对性的,如下图:(javap:java printer的缩写,是jdk自带的一个反编译工具)
- dt.jar就是DesignTime Archive的缩写,首先看一下SUN对于dt.jar的定义:Also includes dt.jar, the DesignTime archive of BeanInfo files that tell interactive development environments (IDE's) how to display the Java components and how to let the developer customize them for the application。其实dt.jar里面主要是swing组件的BeanInfo。IDE根据这些BeanInfo显示这些组件以及开发人员如何定制他们。
2、tools.jar和基础类库的区别
- 在配置环境变量时,你会发现JAVA_HOME、PATH、CLASSPATH这三个变量居然没有基本类库(指所有的Java.*开头的类)和扩展类库(如javax.*开头的类),也就是我们程序中import的那些东东所在的jar包。
- 原因是:CLASSPATH中的这些类都是由Application ClassLoader或者我们自定义的类加载器来加载的,这里当然不能包括基础类库,如果包括基础类库的话,并用两个不同的自定义类加载器去加载该基础类,那它得到的该基础类就不是唯一的了,这样便不能保证Java类的安全性。
- 实际上,这些基础类库都在%JAVA_HOME%\jre\lib目录下(如其中的rt.jar、resource.jar),类加载机制一文中也有提到,该目录下的类(在jar包中)会由Bootstrap ClassLoader自动加载,并通过亲委派模型保证了基础类库只会被Bootstrap ClassLoader加载,这也就保证了基础类的唯一性。
- 另外,扩展类库在%JAVA_HOME%\jre\lib\ext目录下,该目录下的类是由Extension ClassLoader来加载的,有时候我们也要import这里面的类,但是并没有基础类库用的频繁。同样,Extension ClassLoader也会自动到该目录下找扩展类,而不需要我们指定。
本博客部分内容转载自CSDN
作者:兰亭风雨 原文:https://blog.csdn.net/ns_code/article/details/18547959