浅谈Java中path、classpath环境变量的配置问题

一、 编译和运行Java程序必须经过两个步骤:

1、将源文件编译成字节码;

2、解释执行平台无关的字节码程序。

二、问题

以上两个步骤分别需要使用javac和java两个命令(javac命令对java源文件进行编译生成class文件,java命令对生成的class文件进行运行),如果我们直接在cmd命令行窗口里依次输入javac和java命令,可能会看到以下错误:

另外当我们移动了class文件后,执行java命令时,会出现以下错误:

三、分析问题

我们已经在计算机里安装了JDK,而jdk的安装路径下也包含了java和javac命令,为什么会出现这样的错误。

错误一:原因是命令行或控制台没有找到javac和java命令。

当我们输入javac或java命令时,命令行会先在当前目录中(上例为:E:/Demo/java)查找是否有javac.exe或java.exe 这个文件,若没有则在系统的path环境变量中查找。

错误二:这是因为命令行没有找到class文件。

当我们执行java命令时,若没有配置classpath环境变量,则java虚拟机会在当前目录下查找class文件(即Java类),若当前目录下没有,则会出错;若我们配置了classpath环境变量,则java虚拟机会直接到环境变量指定的路径查找。

四、解决方案

错误一:

根据问题分析,错误一的解决方案有两种:一是需要我们找到文件所在目录,二是直接在系统里配置path环境变量。

很显然第一种方法太麻烦了些,而第二种方法可谓是一劳永逸,它可以让我们在任意目录下都可以执行程序。那得如何配置path环境变量呢?

path环境变量

Windows操作系统根据Path环境变量来查找命令。PATH环境变量的值是一系列路径,如我的计算机里的path变量是这样的:

D:\TELLHOW\java\jdk1.5.0_09\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin;C:\Windows\System32;D:\app\Administrator\product\11.2.0\dbhome_1\BIN;D:\Program Files\MySQL\MySQL Server 5.5\bin

Windows将在这一系列的路径中依次查到命令,如果能找到这个命令,则该命令是可执行的,否则就会出错。

(path和PATH在Windows操作系统中是没有区别的,它不区分大小写)

因此,我们只需找到javac和java命令的存放路径,如:D:\TELLHOW\java\jdk1.5.0_09\bin,添加进path环境变量中即可,注意用“;”分号隔开。

我们可以在命令行内直接输入javac,按“Enter”键来验证配置是否正确,若看到以上信息(这其实是javac.exe的使用信息,以后我们会用到里面的几个),则表示配置正确(这与路径“E:/Demo/java”无关)。

写到这可能有人会问,“E:/Demo/java”是谁的地址呢?很显然这是程序javac.exe所运行文件Test.java的路径。

错误二:

几乎每一本介绍java入门的书里都会介绍classpath环境变量的配置,在网上也有很多,但对于classpath环境变量的作用则常常语焉不详。

其实,如果使用1.5以上版本的JDK,完全可以不用设置classpath环境变量就能正常运行程序。因为1.5版本以上JDK有一个功能,它会自动搜索当前路径下的类文件,而且使用Java的编译和运行工具时,系统可以自动加载dt.jar(是关于运行环境的类库,主要是swing的包)和tools.jar(是关于一些工具的类库)文件中的Java类,因此不再需要设置classpath环境变量了。

但是其之前的版本并没有这样的功能,所以我们会看到网上会有这样的配置:.;C:\ProgramFiles\Java\jdk1.7.0_05\lib\dt.jar;C:\Program Files\Java\jdk1.7.0_05\lib\tools.jar;

这个配置中前面一点表示当前路径,另外是将dt.jar和tools.jar两个文件添加到classpath环境变量里。

从上不知道你有没有发现问题,一个1.7版本的竟然还在使用1.4及以前的classpath环境变量配置方法,这似乎说明了一个问题,IT行业飞速发展,知识在不断地更新,网上其实有很多的知识是滞后的,所以我们必须重视这样的一个问题,不能太过实用主义。

那么classpath环境变量的作用是什么呢?

如果我们有很多类文件并放在不同的路径下,当我们需要执行指定路径下的文件时,这时classpath环境变量就体现了它的用处。

五、问题延伸

不知你有没有想过,在一些特殊的情况下我们可能会使用临时的环境变量配置。比方说我们借用别人的计算机时,却不能改动别人的计算机设置,这时你会怎么做?我想最好的办法就是一个移动U盘加临时环境变量配置。

临时环境变量配置可以使用DOS命令,在cmd命令行中输入set,你会看到你的计算机中所有的环境变量,如图所示:

而通过输入set  path可显示出path的所有变量,如图:

而设置临时的path环境变量则只需输入:

set  path=F:/Demo/java即可,它对计算机系统中的配置没有影响。

另有输入:

set path=F:/Demo/java;%path%

这表示在原有的设置上添加一个路径,对对计算机系统中的配置没有影响。

总结一下就是:

set:用于查看本机的所有环境变量;

set 变量名:查看一个具体的环境变量;

set 变量名=:清空一个环境变量;

set  变量名=具体值:给指定变量定义具体指;

set 变量名=具体值;%path%:在原有环境变量基础上添加新值。

注意:这种配置方式只在当前dos窗口有效,窗口关闭后则配置消失。

同理可得,classpath环境变量的临时配置也是一样,在此不多啰嗦。

时间: 2024-10-25 15:14:17

浅谈Java中path、classpath环境变量的配置问题的相关文章

java中JDK的环境变量配置

JDK环境变量装备以下观念为自个自个了解,不一定完全正确,期待评论纠正! 关于jdk的环境变量装备,通常会讲到三个,分别是JAVA_HOME,CLASSPATH,PATH.1.关于path,应该是最好了解的号码归属地查询,path是windows的体系环境变量,不是由于jdk而存在的,它的设置即是为了在恣意目录下履行jdk目录中bin文件夹应用程序的便利,将%JAVA_HOME%\bin目录存放于关键词挖掘工具path中,在恣意途径的cmd窗口中便都能够运转javac,java,jar等程序了.

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实

浅谈Java中的深拷贝和浅拷贝

浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: [java] view plaincopyprint? int apples = 5; int pears = apples; int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float

浅谈Java中的栈和堆

人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数据,栈对应的英文单词是Stack 基本类型 引用类型变量 方法 Java的堆中存储以下类型数据,堆对应的英文单词是Heap 实例对象 在函数中定义的一些基本类型的变量(8种)和对象的引用变量都是在函数的栈Stack内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈Java中set.map.List的区别

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用