您的位置:首页 > 编程语言 > Java开发

java中classpath和路径的使用

2011-01-03 11:57 218 查看
Part1

javac:如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class
文件不在当前目录下,这种情况下就需要在javac命令后面加上-classpath参数,通过使用以下三种类型的方法来指导编译器在编译的时候去指定的路径下查找引用类。

  (1).绝对路径:javac -classpath c:/junit3.8.1/junit.jar Xxx.java
(2).相对路径:javac -classpath ../junit3.8.1/Junit.javr Xxx.java
(3).系统变量:javac -classpath %CLASSPATH% Xxx.java
(注意:%CLASSPATH%表示使用系统变量CLASSPATH的值进行查找,这里假设Junit.jar的路径就包含在CLASSPATH系统变量
中)

Part2

  javac绝对路径的使用:

  javac:假设你要编译的类文件名叫:HelloWorld.java,其完全路径为:D:/java/HelloWorld.java。但
你所在的当前目录是:C:/Documents and Settings/peng>。如果想在这里执行编译,会有什么结果呢?

  (1).C:/Documents and Settings/peng> javac HelloWorld.java
这时编译器会给出如下的错误提示信息:error: cannot read:
HelloWorld.java这是因为默认情况下javac是在当前目录下查找类文件,很明显这个路径不是我们存放类文件的地方,所以就会报错了

  (2).C:/Documents and Settings/peng>javac D:/java/HelloWorld.java这时编译成功。

  所以,只要你执行javac命令的目录不是类文件存放的目录,你就必须在javac命令中显式地指定类文件的路径

part3

  java -classpath的使用:

  java:假设我们的CLASSPATH设置为:D:/peng/java/pro ,在该目录下有三个文件:HelloWorld.java
/ HelloWorldExtendsTestCase /
HelloWorldExtendsHelloWorld。这三个文件的类声明分别如下:

  HelloWorld.java :public class HelloWorld
HelloWorldExtendsHelloWorld.java :public class
HelloWorldExtendsHelloWorld extends HelloWorld
HelloWorldExtendsTestCase.java:public class HelloWorldExtendsTestCase
extends junit.framework.TestCase

  假设我们已经按照上面关于javac -classpath和javac 绝对路径的使用,顺利地完成了三个文件地编译。现在我们在C:/Documents and Settings/peng>目录下执行这三个.class文件

  (1).C:/Documents and Settings/peng>java HelloWorld

  Hello World

  可以看到执行成功。为什么我们在 C:/Documents and
Settings/peng>执行命令,JVM能够找到D:/peng/java/pro/HelloWorld.class文件呢?这是因为我们
配置了系统变量CLASSPATH,并且指向了目录:D:/peng/java/pro
。所以JVM会默认去该目录下加载类文件,而不需要指定.class文件的绝对路径了。

  (2).C:/Documents and Settings/peng>java HelloWorldExtendsHelloWorld

  Hello World

  可以看到执行成功了。HelloWorldExtendsHelloWorld继承了HelloWorld类,所以在执行时JVM会先查找在
CLASSPATH下是否存在一个HelloWorld.class文件,因为我们已经成功编译了HelloWorld类了,所以可以成功执行
HelloWorldExtendsHelloWorld.class

  (3).C:/Documents and Settings/peng>java HelloWorldExtendsTestCase Exception in thread
"main" java.lang.NoClassDefFoundError:
junit/framework/TestCase可以看到程序抛出异常了,提示找不到junit.framework.TestCase文件。为什么同
样在D:/peng/java/pro
下,HelloWorldExtendsHelloWorld.class就可以成功执行,而这个就不行了呢?这是因
为:junit.framework.TestCase.class文件并不存在于当前目录下,所以为了能够让程序成功运行,我们必须通过指定
CLASSPATH的方式,让JVM可以找到junit.framework.TestCase这个类,如(4):

  (4). C:/Documents and Settings/peng>java -classpath %CLASSPATH% HelloWorldExtendsTestCase

  Hello World

  总结:

  (1).何时需要使用-classpath:当你要编译
执行
的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过
-classpath来引入类(2).何时需要指定路径:当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时,就需要指定源文件的路
径(CLASSPATH是用来指定.class路径的,不是用来指定.java文件的路径的)

javac 指定classpath只是指定去哪儿找到要用的class(因为指定的是class path嘛), 源文件还是在当前目录下找(除非指定/Users/andrew/.../HelloWorld.java)

java 指定classpath指定了执行会用到的class所在的路径,比如你当前目录下有个HelloWorld.class其中用到了java.util.Scanner类,那么直接java HelloWorld就能成功运行(java默认库中的包自己总能找到).可是如果你指定java -cp ./temp/andrew.jar HelloWorld,那么HelloWorld.class可就找不到了,这时你必须加上java -cp ./temp/andrew.jar:./ HelloWorld这样就ok了, 如果有些.class文件或者jar文件在CLASSPATH中那么可以包含进来java -cp ./temp/andrew.jar:./:$CLASSPATH HelloWorld.

附:bash和csh中设置classpath的方法

For bash shell:

export CLASSPATH=$CLASSPATH:/java/classes:/home/tchin/myclasses


For tcsh or csh:

set CLASSPATH = ($CLASSPATH /java/classes /home/tchin/myclasses)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: