1。我先在E:\JAVA\  目录下新建了一个文件夹p1,然后我将三个.java文件保存在此文件夹里,我通过命令行方式编译并且通过了。接着,我又在E:\JAVA\ 下新建了文件夹p2,然后将二个.java文件放到此文件夹里,这两个.java文件都调用了p1中的类,我仍然在命令行下编译,但是出现编译错误,提示找不到p1,我将P1复制到p2里,再次编译运行,这次通过了,我想知道这是怎么回事???
2。还有就是在命令行方式下编译的时候,为什么必须把同一包中的所有.java文件一次性通过javac编译,而不能一个一个的分别编译呢???

解决方案 »

  1.   

    1. 要看你的classpath的设置,以及java文件中package后面的路径。如果你的classpath设置为E:\JAVA\,那么p1中的.java文件必须加上package p1;编译产生的.class文件也位于E:\JAVA\p1\下;同理,p2中的.java文件必须加上pacage p2;编译产生的.class文件也位于E:\JAVA\p2\下。2. 同一包下的文件可以分开编译,只要正在编译的java文件中使用到的类都存在即可。
      

  2.   

    p1和p2中的.java文件我都分别将package p1;和package p2;写入了;我是想知道为什么p1和p2并列放在E:\JAVA\下时,系统提示找不到包p1,而必须让p1放到p2里,才能找到呢??
    我用JCreator编译的时候,p1和p2不存在包含,也能通过编译没出现错误,这是为什么呢???
      

  3.   

    p1和p2中的.java文件我都分别将package p1;和package p2;写入了;我是想知道为什么p1和p2并列放在E:\JAVA\下时,系统提示找不到包p1,而必须让p1放到p2里,才能找到呢??
    你要是这样说的话,我基本上可以确定是你的classpath设置为:E:\JAVA\p2了,你可以仔细检查一下这一方面。我用JCreator编译的时候,p1和p2不存在包含,也能通过编译没出现错误,这是为什么呢???
    用IDE不需要考虑包的问题,因为IDE会帮助你自动加上必需的参数。
      

  4.   

    我的classpath:.;C:\j2sdk1.4.2_10\libp1中的三个.java文件我都在开头加了package p1;p2中的两个.java文件我加了package p2;我没用import,我在p2中的.java文件调用p1中的类的语句处用的全名,也就是包名(p1)+类名;我在命令行方式是这样键入的:
    先编译p1中的.java文件:
    E:\JAVA\p1>javac SamePackage.java Protection.java Derived.java Demo.java(编译通过)
    然后:
    E:\JAVA\p1>cd..
    E:\JAVA>java p1.Demo(显示出正确结果)再编译p2中的.java文件:
    E:\JAVA\p2>javac Demo.java OtherPackage.java Protection2.java(编译通不过)
    错误信息:
    Protection2.java:2: package p1 does not exist
    class Protection2 extends p1.Protection
                                ^
    OtherPackage.java:6: package p1 does not exist
                    p1.Protection p=new p1.Protection();
                      ^
    OtherPackage.java:6: package p1 does not exist
                    p1.Protection p=new p1.Protection();
                                          ^
    Protection2.java:9: cannot resolve symbol
    symbol  : variable n_pro
    location: class p2.Protection2
                    System.out.println("n_pro="+n_pro);
                                                ^
    Protection2.java:10: cannot resolve symbol
    symbol  : variable n_pub
    location: class p2.Protection2
                    System.out.println("n_pub="+n_pub);
                                                ^
    5 errors接着我将包p1整个复制到包p2中再次编译:
    E:\JAVA\p2>javac Demo.java OtherPackage.java Protection2.java(这次编译通过了)
    E:\JAVA\p2>cd..
    E:\JAVA>java p2.Demo(得到正确结果)这到底是什么原因呢?
      

  5.   

    看来楼主对JAVA的包访问机制不甚了解。把classpath中的.;去掉,换成E:\JAVA\;,再编译。如果编译成功,注意看一下生成的.class文件在什么位置(一般是在和java源文件相同的位置)。package后面的路径应该和class文件在E:\JAVA\后面的路径完全一致。比如
    package p1;
    class文件就应该位于E:\JAVA\p1
      

  6.   

    .;
    -----这个不就是指的当前路径吗?那我在命令行方式下直接进入E:\JAVA\p2 进行编译,这不就是在文件的当前路径下编译吗?把classpath中的.;去掉,换成E:\JAVA\;,再编译。
    -------如果是因为这个原因,那为什么p1中的文件能通过编译呢?
      

  7.   

    Dan1980(不用IDE的大傻瓜) :嗯~~我将classpath中的.;去掉,换成E:\JAVA\;,再编译,这次编译成功了,它能找到p1了,
    class文件位于E:\JAVA\p2中;可是我还是不知道这是为什么,为什么我不改classpath它就找不到p1包呢?
      

  8.   

    1.
    javac在编译Protection2.java时,
    遇到p1.Protection,
    会去找p1/Protection.java这个文件
    jre/lib和jre/lib/ext下是系统缺省去找的
    当然没有
    然后从当前目录找,没有
    如果你在CLASSPATH中设置E:\JAVA
    则就去找E:\JAVA\p1\Protection.java
    这样就会找到,否则找不到,错误2.只要你编译想要被java执行的主类文件就可
    编译器会自动去寻找引用的.java文件,并进行编译
    另外你也可 javac *.java
      

  9.   

    没有关系,我也初学E:\JAVA\p2>javac Demo.java OtherPackage.java Protection2.java
    这个E:\JAVA\p2就是当前目录
    另如果你不进入到E:\JAVA\p2中去编译
    在E:\JAVA中,这时当前目录为E:\JAVA,编译器也会找到相应的文件
    javac p2\*.java,也可通过
    这样CLASSPATH就不需要加上E:\JAVA
      

  10.   

    呵,我正看java核心技术包的这块,正在试验
    还有一点,是直接指定类查找路径javac -classpath E:\java Demo.java OtherPackage.java Protection2.java