读书人

彻底了解classpath

发布时间: 2012-11-04 10:42:41 作者: rapoo

彻底理解classpath
以前学过一点java,注重的只是语言本身的东西,对于像path,classpath等没有太注意,只是简单的学会使用。最近在看Lucene,于是再一次接触到java,发现以前对classpath的理解实在浅薄。今天再次学习classpath,有一些体会。记录如下.

假设在c:\work下写了一个HelloWorld.java,而且已经编译成了HelloWorld.class,在不切换路径的情况下,直接可以执行java HelloWorld来载入HelloWorld.class。

如果切换到C:\下面或是其他路径,那么该如何载入HelloWorld.class并执行呢?
首先要明白java这个命令行是干什么的?执行java,其实就是启动jvm,后面跟着类的名称,表示由jvm载入该类的.class并执行。

我们知道,在操作系统下使用命令行的时候,OS会根据path中的路径信息,试图找到可执行的文件(在windows下面就是。exe、bat文件)。

那么jvm是什么呢?jvm是java程序唯一识别的操作系统,对jvm来说,可执行文件就是扩展名为.class的文件。当要在jvm中执行某个它的可执行文件(.class)时,jvm会依据classpath中的路径信息来寻找。

作个简单的比照,可以很清楚的对照path和classpath:

OS依据path中的路径信息来寻找可执行指令;
JVM(java虚拟机)依据CLASSPATH中的路径信息来寻找可执行指令(.class文件)。

回到我们最先提出的问题,那我们现在可以得到解决的办法了。

java -cp c:\work HelloWorld



以上我们明白了classpath的基本作用。

输入javac我们可以看到其中的参数选项
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置


我们就是用-cp或者是-class来指定我们要找的文件。


我写了一个java文件,其中需要用到lucene-core-2.4.1.jar这个包,但是我并没有把这个包放到classpath中。于是在编译的时候我是这样做的:


javac -cp D:\java\lucene\lucene-2.4.1\lucene-2.4.1\lucene-core-2.4.1.jar Indexer.java

这样编译时没有什么问题的!

执行
java Indexer
结果却出错了:

当然这个问题我很快就意识到了,是没有把需要的包加进来(不只是编译的时候需要classpath,执行的时候同样需要).于是我把它加了进来:

java -cp D:\java\lucene\lucene-2.4.1\lucene-2.4.1\lucene-core-2.4.1.jar Indexer
但是结果仍然是错的。

我们比较一下就会发现,这2个异常是不一样的。第一个是没有找到包里面的文件。而第二个则是没有找到Indexer文件。

这个错误和我们最先出现的错误是一样的。于是我们可以采取引入到classpath的办法解决。意思就是说:

java -cp c:\;D:\java\lucene\lucene-2.4.1\lucene-2.4.1\lucene-core-2.4.1.jar Indexer

这样就把问题给解决了!
package www;public class Hello{public static void main(String[] args){Message mms=new Message("love you");mms.pp();}}
当然在编译的时候,我们可以这样
javac -d . Message.java
javac -d . Hello.jave

编译完成之后,我们执行
java www.Hello就可以
当在其他地方运行这些文件的时候,我们必须引入classpath,这样才可以运行程序。比如我们再D:盘运行的时候,需用这样的命令:
java -cp c:\ www.Hello
才可以得到想要的结果!

读书人网 >软件架构设计

热点推荐