首先,我的系统是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:\,为什么还是只能这一种方法运行呢?

解决方案 »

  1.   

    楼主的意思是想直接:java HelloWorld 就能运行这个类是吗?不可能的,如果这样可以的话,试想:
    你有另外一个类,名字也叫HelloWorld,不同的是这个类不在com.bryantd.javaP包中,而是在另外一个包com.other.javaP中,那么用java HelloWorld 执行的,到底应该是哪一个包里的HelloWorld呢?这样不就同没有包机制一样混乱了么
    理想情况下,类名加上包名就不会有这种冲突了
      

  2.   

    如果说一定要带包名运行的话,为什么不是在任何路径下都能运行得呢?
    一定要在e:\>下才行呢?我的ClASSPATH已经设置了e:\>
    在别的路径下运行,应该会自动去e:\>下去找类文件阿,所以我觉得应该在什么路径下都能带包名运行,但事实是不是这样的~~谁能解释一下?
      

  3.   

    我运行了,没什么问题,估计楼主设完classpath后没有重新再开一个cmd窗口
      

  4.   

    那就不应该了,很可能是环境变量设置的不对
    你在命令行下用set命令看一下,设置的classpath有没有生效,我记得在win2000里面设置环境变量后要重新启动
    XP就不用,在新开的命令行窗口里都有效
      

  5.   

    我发现问题出在哪里了
    在设置环境变量的时候,不能把当前路径“.”设置在最前面,而应该把握自己生成包的路径设置在最前面,这样就没问题了,如下:
    CLASSPATH: e:\; c:\j2dk\lib; .;
    但是我觉得JDK这样的机制不太合理阿~~按说应该是从前向后找,直到找到最后一个CLASSPATH,若再找不到就算完了。而事实上是找第一个当前路径下没有相关类就结束了,好像不太合理吧~~当然通过楼上那位兄弟的解释,我明白了为什么一定要带包执行了。
      

  6.   

    java -classpath e:\ HelloWorld
      

  7.   

    隨著程式碼撰寫越來越多,程式內容越來越大,您會發現管理程式中的變數名稱、方法名稱、類別名稱也會是一件麻煩的事,尤其是一些同名問題的發生,例如在程式中,您也許會定義一個Point類別代表2維空間的點,也許在程式的某個地方,您也會定義一個 Point類別來表示一個3維空間的點,其它像函式同名、共用變數同名的情況也可能發生,當這種情況發生時,其中一個定義就可能將另一個定義給覆寫掉了。Java提供package機制,它就像是一個管理容器,可以將您所定義的名稱區隔管理在package下,而不會有相互衝突的發生,例如您定義了一個 dimension2d與dimension3d的package,在它們之下都有一個Point類別,但由於屬於不同的package,所以這兩個名稱並不會有所衝突。Java的package被設計為與檔案系統結構相對應,如果您的package設定是only.caterpillar,則該類別應該在指定目錄(或jar)的onlyfun/caterpillar下可以找到,為了要能建立與package相對應的檔案系統結構,您在編譯時可以加入-d 參數,並指定要建立在哪一個目錄之下。下面這個程式使用"package"關鍵字來建立package以管理我們所定義的類別: UsePackage.java
    ----------------------------------------- 
    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! 
      

  8.   

    package了,那么就必须要带包运行了。
    平时自己练习,就不要使用什么package了。
      

  9.   

    问了半天,还没每人给我回答这个问题:在设置环境变量的时候,不能把当前路径“.”设置在最前面,而应该把握自己生成包的路径设置在最前面,这样就没问题了,如下:
    CLASSPATH: e:\; c:\j2dk\lib; .;
    但是我觉得JDK这样的机制不太合理阿~~按说应该是从前向后找,直到找到最后一个CLASSPATH,若再找不到就算完了。而事实上是找第一个当前路径下没有相关类就结束了,好像不太合理吧~~
      

  10.   

    是应该把“.”放在前面的。“.”的意思就是当前目录的意思。你又已经有了package。所以你就应该在e:\下运行。肯定不能在包里面运行吧??是不?