转载:http://blog.csdn.net/wym19830218/article/details/5399401
JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C:/Program Files/Java/jdk1.5.x/目录下的JRE。而C:/Program Files/Java/目录下的JRE是用来执行我们自己编写的JAVA程序。当然,两套JRE中的任何一套都可以用来执行我们自己编写的JAVA程序, 但是JDK里面的工具只能由C:/Program Files/Java/jdk1.5.x/目录下的JRE来执行。
也就是说
jdk(java development kit)是开发工具包,相当于是一个编译器。
jre(java runtime environment)是运行环境,相当于jvm虚拟机。jdk开发出来的java程序必须在jvm中运行,jre就提供了这么一个环境。
----------------------------------------------------------------------------
JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
如果安装了JDK,会发同你的电脑有两套JRE,一套位于 /jre 另外一套位于 C:/Program Files/Java/jre1.5.0_15 目录下,后面这套比前面那套少了Server端的Java虚拟机,不过直接将前面那套的Server端Java虚拟机复制过来就行了。而且在安装JDK可 以选择是否安装这个位于 C:/Program Files/Java 目录下的JRE。如果你只安装JRE,而不是JDK,那么只会在 C:/Program Files/Java 目录下安装唯一的一套JRE。
JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。 所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。
1、为什么Sun要让JDK安装两套相同的JRE?
这是因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 /lib/tools.jar 里。从下面例子可以看出,先将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 是一样的,会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。 而且可以发现/lib目录下的程序都很小,不大于2 9K,从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写,所以也是Java应用程序,因此要使用JDK所附的工具来开发Java程 序,也必须要自行附一套JRE才行,所以位于C:/Program Files/Java目录下的那套JRE就是用来运行一般Java程序用的。
2、如果一台电脑安装两套以上的JRE,谁来决定呢?
这个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行Java程序。 Java.exe依照底下的顺序来查找JRE:自己的目录下有没有JRE;父目录有没有JRE;查询注册表: [HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment] 所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。
ADD:(小小结)
1.JVM -- java virtual machine
JVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的 部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是 经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
2.JRE -- java runtime environment
JRE 是指java运行环境。光有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你 可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起 来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你 写程序了。(jre里有运行.class的java.exe)
3.JDK -- java development kit
JDK是 java开发工具包,基本上每个学java的人都会先在机器上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有六个文件 夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的是以下四个文件夹:bin、include、lib、jre。现 在我们可以看出这样一个关系,JDK包含JRE,而JRE包含JVM。
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库
jre:java运行环境
(注意:这里的bin、lib文件夹和jre里的bin、lib是不同的)总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。
eclipse、idea等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选中jre路径就ok了。
如果机子里安装了多个版本的jdk,如下:
BEA Weblogic Server 7.0 自带一套 JDK1.3.1_02
下载了一套最新的JDK1.4.1_02
JBuilder9自带一套JKD1.4.1_02
Oracle 8.1.7自带一套JRE1.1.7
Ration Rose自带一套JDK1.3
DreamWeaver自带一套JDK1.3
6套JRE,每套JRE都被各自安装到不同的目录,不会互相影响。当在控制台执行java.exe, 操作系统寻找JRE的方式如下:
先找当前目录下有没有JRE
再找父目录下有没有JRE
接着在PATH路径中找JRE
注册表HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment/ 查看CurrentVersion的键值指向哪个JRE
最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。
-------------------------------------------------------------------------------------
JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。
可执行的JAR
一个 可执行的 jar 文件是一个自包含的 Java 应用程序,它存储在特别配置的JAR 文件中,可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但是使用可执行的 JAR 文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用程序。
创建可执行 JAR
创建一个可执行 JAR 很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中的主类是 com.mycompany.myapp.Sample 。您要创建一个包含应用程序代码的 JAR 文件并标识出主类。为此,在某个位置(不是在应用程序目录中)创建一个名为 manifest 的文件,并在其中加入以下一行:
Main-Class: com.mycompany.myapp.Sample
然后,像这样创建 JAR 文件:
jar cmf manifest ExecutableJar.jar application-dir
所要做的就是这些了 -- 现在可以用 java -jar 执行这个 JAR 文件 ExecutableJar.jar。
一个可执行的 JAR 必须通过 menifest 文件的头引用它所需要的所有其他从属 JAR。如果使用了 -jar 选项,那么环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略。
启动可执行 JAR
既然我们已经将自己的应用程序打包到了一个名为 ExecutableJar.jar 的可执行 JAR 中了,那么我们就可以用下面的命令直接从文件启动这个应用程序:
java -jar ExecutableJar.jar
META-INF 目录
大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息。Java 2 平台识别并解释 META-INF 目录中的下述文件和目录,以便配置应用程序、扩展和类装载器: MANIFEST.MF。这个 manifest 文件定义了与扩展和包相关的数据。
INDEX.LIST。 这个文件由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速类装载过程。
xxx.SF。 这是 JAR 文件的签名文件。占位符 xxx标识了签名者。
xxx.DSA。 与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名。