- 浏览: 125596 次
- 性别:
- 来自: 山东
最新评论
J2SDK(Software Development Kit for Java 2) ,简称JDK.它包括了JDK(Java Development Kit),JRE(Java Runtime Enviroment),Java Plug-in.
JDK (Java Development Kit), Java开发工具包(C:\Java\jdk1.6.0_18\).JDK是一组API,也可以说是一些java Class。JDK是一切java应用程序的基础,所有的java应用程序是构建在这个之上的。
JRE (Java Runtime Environment),Java运行环境. 说明:当安装过JDK之后会在c:\windows\system32下有一个java.exe,而系统的环境变量中%SystemRoot%\system32;是默认添加上的,而%SystemRoot%实际上就是C:\WINDOWS。
电脑有两套JRE,一套位于%JAVA_HOME%\jre另外一套位于C:\Java\jre6目录下。我们编写的Java程序要JRE才能运行,当你装完JDK后硬盘上的两套JRE都具有运行Java程序的功能,只是后者比前面那套少了Server端的VM,但是JDK里面的工具只能由"<JDK安装目录>\jdk1.6.0_18\"目录下的JRE来执行。server与client选项的差别在于所使用的VM不同,执行Java程序时默认会使用client VM。若使用server VM,会花费较长的启动时间及消耗较多的内存,为的是启动Java程序后可以获得较好的执行效能。
为什么会有两套JRE呢? 因为JDK里面有很多用Java所编写的开发工具(如javac.exe、jar.exe等),而且都放置在 <JDK安装目录>\lib\tools.jar里,它们本身运行的时候也需要一套 JRE,也就是前者(%JAVA_HOME%\jre);而后者(C:\Java\jre6)的JRE是用来执行我们自己编写的JAVA程序。
设置JAVA_HOME,CLASSPATH,PATH的目的:
1.设置JAVA_HOME(C:\Java\jdk1.6.0_18):
一、方便引用,要使用这个路径的时候, 只需输入%JAVA_HOME%即可;
二、修改简单, 当JDK路径改变的时候, 仅需更改JAVA_HOME的即可;
三、第三方软件会引用约定好的JAVA_HOME变量
2.设置PATH(%JAVA_HOME%\bin):
让Java执行环境找到指定的工具程序如Java、javac,系统会在当前目录下查找,若没有找到会到系统PATH中查找。
3.设置CLASSPATH:
让Java执行环境找到指定的Java程序(也就是.class文件)。
Java运行时环境(JRE)查找启动类,并加载其他使用到的类(即当加载A时,发现A应用了B则再去加载B),从三个地方加载需要的类:bootstrap class path, the installed extensions, and the user class path。
JDK5.0默认会在当前工作目录以及JDK安装目录/lib中寻找Java程序,若Java程序在这两个目录中则不用设置classpath。classpath在编译和运行时都要用到的参数。当没有这个参数时,java 和 javac 命令会取环境变量 CLASSPATH 来代替。
package com.tools.lcr; public class AppLauncher { public static void main(String [] args) { System.out.println("Hello World " + args[0]); } }
javac -classpath . AppLauncher.java
那么 javac 便会以当前目录(.)作为 classpath。你也可以先将环境变量 CLASSPATH 的值增加当前目录“.”,然后执行效果是一样的。
set CLASSPATH=.;%CLASSPATH% javac AppLauncher.java
当 classpath 很长的时候,为了运行方便(package com.tools.lcr.AppLauncher),java 程序通常都会提供一个批处理文件(如 run.bat)。
rem 环境变量中已设置了JAVA_HOME set JAVA=%JAVA_HOME%\bin\ set LIB=lib/json.jar;lib/saaj.jar;lib/log4j.jar;lib/jaxrpc.jar;lib/dom4j.jar set name=luchunli %JAVA%\javac -d . AppLauncher %JAVA%\java -Xms64m -Xmx256m -Duser.locale=zh_CN -classpath %LIB% com.tools.lcr.AppLauncher %name%
那么就算 classpath 再长,也可以化整为零,比用环境变量方便的多,建议不要依赖于 CLASSPATH 环境变量。编译或运行时将这个变量赋给 classpath 参数即可。
rt.jar是JAVA基础类库,默认就在根classloader的加载路径里面(%JAVA_HOME%\jre\lib和C:\Java\jre6\lib)
tools.jar JDK类库中提供的一些工具类集合的jar文件,是一个工具包(javac等工具)
javac XXX.java 实际上就是运行 java -Calsspath=%JAVA_HOME%\lib\tools.jar xx.xxx.Main XXX.java javac就是对上面命令的包装器(wrapper),其目的是避免开发者输入过长的指令。
dt.jar是关于运行环境的类库,主要是swing的包(%JAVA_HOME%\lib)
将tools.jar改成tools_bak.jar C:\src>javac AppLauncher.java Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/Main Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.Main at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: com.sun.tools.javac.Main. Program will exit. 将tools.jar改回,将rt.jar改名为rt_bak.jar C:\src>javac AppLauncher.java Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object 将rt.jar改名为rt_bak.jar C:\src>java AppLauncher Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object 改变tools.jar对java执行没有影响 C:\src>java AppLauncher luchunli Hello World luchunli
既然电脑上有两套JRE,那么由谁来决定用那一套JRE呢?java.exe的工作就是找到合适的JRE来运行Java程序。
java.exe依照底下的顺序来查找JRE:
自己的目录下有没有JRE;
父目录有没有JRE
查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment]
所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。
环境变量PATH此时为%SystemRoot%\system32
C:\Documents and Settings\Administrator>java -verbose [Opened C:\Java\jre6\lib\rt.jar] [Loaded java.nio.charset.Charset$3 from C:\Java\jre6\lib\rt.jar] [Opened C:\Java\jre6\lib\charsets.jar] [Loaded sun.nio.cs.AbstractCharsetProvider from C:\Java\jre6\lib\rt.jar] [Loaded sun.nio.cs.ext.ExtendedCharsets from C:\Java\jre6\lib\charsets.jar]
将system32下的java.exe修改成java_lcr.exe,添加环境变量%JAVA_HOME%\bin,环境变量此时为%SystemRoot%\system32;%JAVA_HOME%\bin;
C:\Documents and Settings\Administrator>java -verbose [Opened C:\Java\jdk1.6.0_18\jre\lib\rt.jar] [Loaded java.nio.charset.Charset$3 from C:\Java\jdk1.6.0_18\jre\lib\rt.jar] [Opened C:\Java\jdk1.6.0_18\jre\lib\charsets.jar] [Loaded sun.nio.cs.AbstractCharsetProvider from C:\Java\jdk1.6.0_18\jre\lib\rt.jar] [Loaded sun.nio.cs.ext.ExtendedCharsets from C:\Java\jdk1.6.0_18\jre\lib\charsets.jar] //......
实际上此时我们查询注册表可以看到RunTimeLib指示的路径为:C:\java\jre6\bin\client\jvm.dll
java.exe程序只是一个执行的外壳,它会:
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
java.exe创建JVM装载环境的时候会自动查找JRE,然后装入jvm.cfg([%JAVA_HOME%\jre|c:\Java\jre6]/lib/i386/jvm.cfg),而Java正是通过这个jvm.cfg配置文件来管理不同版本的JVM.dll的。通过这些文件我们可以定义目前JDK支持那些JVM,前面部分(client)是JVM名称,后面是参数:
-client KNOWN -server KNOWN -hotspot ALIASED_TO -client -classic WARN -native ERROR -green ERROR KNOWN表示JVM存在,ALIASED_TO表示给别的JVM取一个别名,WARN表示不存在时找一个JVM替代,ERROR表示不存在抛出异常。
Java通过LoadJavaVM来装入JVM.dll文件.动态连接库JVM.dll才是java虚拟机的实际操作处理所在,装入工作很简单就是调用Windows API函数:
LoadLibrary装载JVM.dll动态连接库.然后把JVM.dll挂界到JNIENV(JNI调用接口)实例(把导出函数JNI_CreateJavaVM和 JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和 GetDefaultJavaVMInitArgs函数指针变量)上。JVM.dll的装载工作宣告完成。
调用InvocationFunctions->CreateJavaVM也就是JVM中JNI_CreateJavaVM方法获得JNIEnv结构的实例,然后就可以调用JNIEnv实例装载并处理class类。
Java程序有两种方式(jar包和class文件)
如果是执运行jar。 java -jar XXX.jar运行的时候,Java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用Java类 Java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取 getAttributes("Main-Class")的值,即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main 函数直接调用java.c中LoadClass方法装载该类。
如果是执行class方法。main函数直接调用java.c中LoadClass方法装载该类。然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中
“publicstaticvoidmain(String[]args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的CallStaticVoidMethod方法调用该Java类的main方法。
发表评论
-
闷葫芦的世界
2016-01-09 22:57 374工作几年,零零散散也整理了不少东西,但都是东一榔头西一棒槌的, ... -
JavaMail(一)
2011-04-26 18:04 1237浅谈邮件传输协议 SMTP(Simple Ma ... -
Tomcat配置SSL的双向认证
2011-04-26 16:58 2428证书保存在服务器端,用户通过浏览器访问时,需要 ... -
Tomcat配置SSL的客户端认证
2011-04-26 16:41 2447证书保存在服务器端,用户通过浏览器访问时,需要 ... -
Java实现国际化
2011-04-20 15:15 13181.根据不同语言环境使用不同文件 ... -
Java动态编译(二)
2011-04-19 17:16 2279在上一篇(Jav ... -
Java动态编译(一)
2011-04-18 18:10 7125一般情况下对java源文件的编译均是在代码完成 ... -
Java抽象类和接口
2011-04-18 15:34 2075一个Java接口(Interface)是一些方 ... -
Java线程(三)
2011-04-15 11:51 1218浅谈synchronized应何时使用 ... -
Java线程(二)
2011-04-15 10:23 987浅谈synchronized应用于类方法和类字面量之上 ... -
Java线程(一)
2011-04-14 11:29 966线程同步:synchronized方法和syn ... -
ClassLoader
2011-04-12 16:58 1180当运行Java程序时,首先运行JVM(java虚拟 ... -
NIO第二部分复用和编码
2011-04-08 14:46 828public abstract class Sel ... -
NIO第一部分缓冲区和通道
2011-04-08 14:40 1409系统运行的性 ...
相关推荐
### CLASSPATH 和 PATH 的配置 #### 一、概述 在Java开发环境中,正确配置环境变量是确保程序能够正常编译和运行的关键步骤之一。本文主要介绍如何正确设置`CLASSPATH`与`PATH`这两个重要的环境变量,特别是针对...
### classpath与path详解 #### 一、概念介绍 在深入了解`classpath`和`path`之前,我们需要先明确这两个环境变量的基本...通过上述步骤和案例分析,我们可以更好地理解和应用`classpath`和`path`的概念及其配置方法。
本文将详细解释PATH和CLASSPATH这两个关键环境变量的实质和设置方法。 首先,PATH环境变量是操作系统用来查找可执行文件(如javac.exe)的路径列表。当你在命令行输入一个命令时,系统会在PATH变量定义的各个目录中...
Jdk环境变量中的`classpath`和`path`变量在Java开发中扮演着至关重要的角色。这两个变量主要用于指示操作系统和Java执行环境如何查找并执行相关的工具程序和Java类文件。 首先,`PATH`环境变量是所有操作系统都有的...
为了在操作系统上运行Java程序,我们需要正确配置几个关键的环境变量,其中包括JAVA_HOME、CLASSPATH和PATH。这些环境变量对于确保Java开发工具集(JDK)的正确工作至关重要。 **JAVA_HOME** JAVA_HOME是一个环境...
Java 环境配置是 Java 开发的基础,我们需要正确地配置 JAVA_HOME, CLASSPATH, PATH 等环境变量,以便正确地编译和运行 Java 程序。在本节中,我们将详细地介绍 Java 环境配置的目的和设置方法。 一、JAVA_HOME ...
JAVA_HOME、CLASSPATH和PATH是Java开发者经常需要配置的环境变量,它们各自在Java的运行和编译过程中扮演着重要的角色。 JAVA_HOME环境变量用于指明Java开发工具包(JDK)的安装目录。这个目录包含了Java的编译器...
Java环境配置对于软件开发至关重要,特别是对于初学者来说,理解并正确设置JAVA_HOME、CLASSPATH和PATH这三个环境变量是入门Java编程的基础。首先,我们来深入解析这些变量的含义和作用。 **JAVA_HOME**环境变量是...
总结来说,path和classpath都是环境变量,用来存储路径信息,以便系统或程序能够快速找到特定的文件或目录。path主要帮助操作系统找到可执行文件,而classpath帮助Java程序找到类文件。path通常包含操作系统使用的...
总结来说,Path和Classpath是Java开发者必须掌握的基本概念。理解它们的原理和配置方法,不仅可以帮助你编写出可移植的代码,还能提高问题排查的效率。通过阅读文档《path与classpath配置.doc》,你将能更深入地了解...
其中,`path`和`classpath`是最为关键的两个环境变量,它们直接影响到Java程序能否正常编译和运行。 #### 一、Path 的设置 `path`环境变量主要用来指定操作系统能够访问到的可执行文件路径列表。在Java环境中,...
下面,我们将详细介绍path和classpath的作用、区别以及它们在Java开发中的应用。 path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,...
..java设11置classpath,path,java_home环境变量.docx
..java设11置classpath,path,java_home环境变量.pdf
首先,我们需要下载并安装JDK,接着配置环境变量,包括JAVA_HOME、CLASSPATH和PATH三个变量。配置环境变量是初学者容易出错的地方,因此需要格外小心。在配置环境变量时,我们需要注意变量名和变量值的大小写问题。 ...
在安装 Hadoop 和 HBase 之前,需要配置 JDK 环境变量,包括设置 JAVA_HOME、CLASSPATH 和 PATH 等环境变量。 3. JDK 安装 使用 rpm 包安装 JDK,然后配置 JDK 环境变量,包括设置 JAVA_HOME、CLASSPATH 和 PATH ...
"Java基础知识点" 通过分析给定的文件信息,我们可以生成以下知识点: 1. Java 属于高级语言。这一点可以通过Java的特点...这一点可以通过环境变量的设置来理解,classpath 和 path 都是用于指定搜索路径的环境变量。
在安装过程中,需要配置环境变量,包括设置 JAVA_HOME、JRE_HOME、CLASSPATH 和 PATH 变量。这些变量的设置将影响 JDK 的安装和使用。 具体来说,需要在 /etc/profile 文件中添加以下信息: export JAVA_HOME=/usr...
环境变量的配置主要包括两个方面:一是配置 JDK 的安装路径,二是配置 CLASSPATH 和 PATH 变量。其中,CLASSPATH 变量用于指定 Java 类库的路径,而 PATH 变量用于指定 JDK 的二进制文件的路径。 在配置环境变量时...