开贴强烈介意新手设置classpath的问题

shangqiao 2004-08-28 08:56:15
好多初学Java的人都会遇到classpath的问题,到csdn上面来问回答都是什么加入到系统属性,考到jre\ext下面什么的,我推荐的是千万不要这么作,为什么,一一道来:
首先为什么需要classpath属性,在两个地方会用到,一个是编译的时候,一个是运行的时候,classpath就是告诉Java编译器和虚拟机在其目录下面去找这些类的代码,看是否存在,这这样,找到以后,解释运行就可以了.所以和这相关的错误有:编译期错误,classNotFound,编译的时候没有找到类,运行期错误:classNotDef,运行时没有找到类,那么假如编译通过了,那么是不是就一定能运行了呢,假如是换一台机子,很有可能运行不了,因为那太机子可能没有你需要的类,但是在你机子上有,那么在同一台机子呢,也有可能不能运行,为什么,不是编译时这些类都能找到,难道运行时就找不到了吗,不是的,这些类还是可以找到,但是可能找不到其他的类,如一下代码:
class Main{
A a;
}
当你编译这个类时,找到了类A,所以编译过去了,但是假如这个类A是第三方的,如下源代码:
class A{
B b;
}
他要使用类B,傻眼了吧,你的机子上没有类B的代码,^_^,你的类Main是编译过去了,^_^,就是不能运行.报classNotDef错误

上面是说到要在classpath下面找类,没有的话那么便抛异常的问题,现在来说说虚拟机怎么在classpath下面找类:
呵呵,挨个挨个查找呗!先看你要用什么类,然后在这些文件路径下面查找,当查找到第一个的时候,那么就不用往下找了,所以这就引出了我在最前面说的千万不要
将classpath设到系统属性和jre\ext下面,为什么,举个例子来说,想想,假如有这种情况:
在文件夹java1的下面有类package.A,在j文件夹java2的的下面也有类package.A,这两个类的包名和类明都完全一样,并且都将java1,java2这两个路径加到了classpath下面,
请问当我要用类package.A时,是使用java1下面的呢,还是java2下面的呢?记住,前面说了一句话:"当查找到第一个的时候,那么就不用往下找了",看见了吧,是设在classpath
前面的那个,所以假如是classpath=java1;java2,那么就是取java1里面的,假如是classpath=java2;java1;那么就是java2下面的那个,假如要是classpath=.;也就是将当前目录加
在最前面,那么当然是取当前目录里面的了,这是最好的,所以设classpath时,千万要将"."写在最前面,不然就可能遇到郁闷的问题了.可能你认为这个不容易发生,^_^,那就大错特错了,
最容易发生的就是jar包的版本冲突问题,举个例子,大家都知道struts1.0和1.1不一样,在1.0中一般实现execute方法,但是在1.1中实现perform方法,^_^,假如你是从1.0过渡来的,将1.0的
包设在了系统的classpath下面但是添加1.1时又没有删掉的话,那么便有你郁闷的了(tmd,怎么我的perform方法就是不执行呢,在人家的自己上把我的代码考过去都可以运行呀?),^_^,知道原因了吧,
所以最好在系统的classpath里面只设一个".",使用时脚本:
set path=%path%;%java_home%\bin
set classpath=%classpath%;struts1.1.jar;servlet.jar;
javac ...
java ...
绝对不会出现莫名其妙的问题

废话说了这么多,最主要的还是希望和大家一起进步,因为大家都是java的信徒!java万岁!
...全文
188 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
boykent 2004-09-01
  • 打赏
  • 举报
回复
受益良多, 丁页!!
shangqiao 2004-08-30
  • 打赏
  • 举报
回复
^_^
shangqiao 2004-08-30
  • 打赏
  • 举报
回复
没有去了解过JVM的具体细节,但是我想在编译时,应该只是看要是用的类是否存在,但是也仅仅看在不在而已,因为Java是办解释语言,他不会像c++一样,当发现要引用某个类时,便把类的代码也要编译近来,但是Java只是知道个名字就可以了,当运行时,发现要引用某个类时,在将代码导入
sylmoon 2004-08-30
  • 打赏
  • 举报
回复
在编译器里的有区别?
dlxu 2004-08-29
  • 打赏
  • 举报
回复
看来要进FAQ了
ntzls 2004-08-29
  • 打赏
  • 举报
回复
^_^
shangqiao 2004-08-29
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧