JDK和JRE、paht和classpath
从下面例子可以看出bin中的工具是用java实现的-------------------------------------------------------先将tools.jar改名为tools1.jar,然后运行javac.exe,显示如下结果: Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main这个意思是说,你输入 javac.exe与输入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main是一样的,会得到相同的结果。
?
既然这些工具是用java实现的,那么在使用这些工具的时候就必然要用到一套JRE,所以在JDK中自带了一套JRE,而且在这个JRE的bin目录中包含了client和server两个文件夹,其实就是两种jvm。
?
而位于JAVA_HOME目录下的那套JRE是用来运行一般Java程序用的。
?
JRE是java的运行环境,既然是运行环境,当然要包含jvm(也就是大家熟悉的虚拟机),还有所有java类库的class文件,这些文件在JRE的lib目录下被打包成了jar(rt.jar)。在windows上的虚拟机就是jre6/bin/client里面的jvm.dll。
?
如果电脑上安装了两个JRE,那怎么判定运行java的JRE是哪一个呢?
-------------------------------------------------------------
根据环境变量PATH的配置,系统会首先找到配置的的java.exe?;
?
(注:如果PATH最前面有“%SystemRoot%\system32;%SystemRoot%;”这样的配置,而且在Windows/system32下存在java.exe,那么系统会选择这个java.exe)
?
Java.exe的工作就是找到合适的JRE来运行Java程序,Java.exe依照底下的顺序来查找JRE:
所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。
?
关于环境变量path和classpath
----------------------------------------
你在命令行中输入简单的名称(例如:java,javac)就可以执行相关的程序,但是有一个问题,系统是怎么知道这些程序文件放在哪的呢?
这个就是环境变量path的功劳了,path中存放的是一个目录列表,并使用分号“;”间隔,系统就是通过检索这些目录来定位要执行程序位置。
同样的道理,当java编译器或java虚拟机需要使用一个类文件时(当你从类库中引用了一个类),它们也要先知道从哪里可以获得这些文件,环境变量classpath的工作就是设置这些类文件的位置,它存放的也是夜歌目录列表,并使用分号";"间隔,java编译器或虚拟机会通过它来寻找试图加载的类文件。
所以,如果想让你的JDK工作,就必须配置好这两个环境变量,系统会通过path来找到java或javac的位置,java或javac会通过classpath找到他们需要的类文件。
?
?
add
----------
eclipse、idea等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选中jre路径就ok了
?
参考:
http://www.cnblogs.com/myitm/archive/2011/05/03/2035942.html?
http://shmilylq.iteye.com/blog/244351?
http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jdkfiles.html
http://www.ics.uci.edu/~thornton/ics23/LabManual/SettingUpJava.html