首先,我的系统是XP,我的环境变量是这样设置的:
CLASSPATH: .; c:\j2dk\lib; e:\
我自己写的类放在了下面的文件夹下:e:\com\bryantd\javaP\
下面那是一个在该路径下的小程序,并已经通过编译:
package com.bryantd.javaP;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World.");
}
};
我的理解是,通过环境变量设置的“e:\”,应该是可以在任何路径下运行该.class文件了,因为java虚拟机会按照1、当前路径;2、c:\j2dk\lib;3、e:\的顺序去寻找HelloWorld.class文件,但是我的实验结果是只有一种方法可以运行该程序,那就是在e:\下,执行代包名的HelloWorld类文件:e:\>java com.bryantd.javaP.HelloWorld我想问一下,这是为什么??我的环境变量已经设置了e:\,为什么还是只能这一种方法运行呢?
CLASSPATH: .; c:\j2dk\lib; e:\
我自己写的类放在了下面的文件夹下:e:\com\bryantd\javaP\
下面那是一个在该路径下的小程序,并已经通过编译:
package com.bryantd.javaP;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World.");
}
};
我的理解是,通过环境变量设置的“e:\”,应该是可以在任何路径下运行该.class文件了,因为java虚拟机会按照1、当前路径;2、c:\j2dk\lib;3、e:\的顺序去寻找HelloWorld.class文件,但是我的实验结果是只有一种方法可以运行该程序,那就是在e:\下,执行代包名的HelloWorld类文件:e:\>java com.bryantd.javaP.HelloWorld我想问一下,这是为什么??我的环境变量已经设置了e:\,为什么还是只能这一种方法运行呢?
你有另外一个类,名字也叫HelloWorld,不同的是这个类不在com.bryantd.javaP包中,而是在另外一个包com.other.javaP中,那么用java HelloWorld 执行的,到底应该是哪一个包里的HelloWorld呢?这样不就同没有包机制一样混乱了么
理想情况下,类名加上包名就不会有这种冲突了
一定要在e:\>下才行呢?我的ClASSPATH已经设置了e:\>
在别的路径下运行,应该会自动去e:\>下去找类文件阿,所以我觉得应该在什么路径下都能带包名运行,但事实是不是这样的~~谁能解释一下?
你在命令行下用set命令看一下,设置的classpath有没有生效,我记得在win2000里面设置环境变量后要重新启动
XP就不用,在新开的命令行窗口里都有效
在设置环境变量的时候,不能把当前路径“.”设置在最前面,而应该把握自己生成包的路径设置在最前面,这样就没问题了,如下:
CLASSPATH: e:\; c:\j2dk\lib; .;
但是我觉得JDK这样的机制不太合理阿~~按说应该是从前向后找,直到找到最后一个CLASSPATH,若再找不到就算完了。而事实上是找第一个当前路径下没有相关类就结束了,好像不太合理吧~~当然通过楼上那位兄弟的解释,我明白了为什么一定要带包执行了。
-----------------------------------------
package onlyfun.caterpillar;public class UsePackage {
public static void main(String[] args) {
System.out.println("Hello! World!");
}
} 在編譯時要使用以下的指令: $ javac -d . UsePackage.java
在編譯時使用 "-d" 參數,並指定在現行目錄 "." 中建立檔案與系統結構,則編譯完成之後,在現行目錄中會出現onlyfun/caterpillar目錄,而當中有一個UsePackage.class 檔案,在編譯完成之後,package的指定就成為class名稱的一部份了,在執行時可以這麼下指令:$ java onlyfun.caterpillar.UsePackage
Hello! World!
平时自己练习,就不要使用什么package了。
CLASSPATH: e:\; c:\j2dk\lib; .;
但是我觉得JDK这样的机制不太合理阿~~按说应该是从前向后找,直到找到最后一个CLASSPATH,若再找不到就算完了。而事实上是找第一个当前路径下没有相关类就结束了,好像不太合理吧~~