CLASSPATH和PATH
????? 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文件)。
?
??????既然电脑上有两套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
-client KNOWN-server KNOWN-hotspot ALIASED_TO -client-classic WARN-native ERROR-green ERRORKNOWN表示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方法。?
我的异常网推荐解决方案:java环境变量设置,http://www.myexception.cn/java-other/172921.html