`
wade6
  • 浏览: 270335 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK和JRE、paht和classpath

    博客分类:
  • java
 
阅读更多

学习java这么久了,突然发现自己对JDK和JRE还没有一个清晰的概念,故在网上搜集了一些相关资料并整理下来,填补一下自己的知识断层。

 

JDK和JRE

----------------

 

JDK是Java Development Kit的缩写,即java开发工具包,是开发人员使用的SDK,它提供java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。

 

JRE是Java Runtime Environment的缩写,即java运行环境,面向的对象是java的使用者,而非开发者。

 

说白了,JRE只提供用来运行java程序的环境,而JDK不仅可以提供JRE的功能,而且还提供java开发和代码编译的功能

 

在安装JDK时会选择是否安装单独的jre,如果选择安装,那么会在JAVA_HOME下会单独有一个jre文件夹,例如:

 

我安装的是jdk1.6.0_29,安装完后,目录的结构如下:

 

JAVA_HOME

          \jdk1.6.0_29

               \jre

          \jre6

 

为什么会有两个jre目录呢?

----------------------------------------

 

这是因为JDK里面的开发工具有很多是用Java语言实现的(如javac.exe、jar.exe等,放置在 jdk1.6.0_29\lib\tools.jar 里,bin目录下的命令(例如:javac.exe)只是一个包装器(Wrapper),它们的作用是为了让开发者不必直接使用tools.jar(使用tools.jar需要输入很长的指命),所以jdk bin目录下的程序都很小,一般不大于200K。

 

从下面例子可以看出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:

  • 自己的目录下有没有JRE;
  • 父目录有没有JRE;
  • 查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]

所以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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics