javac 在没有指定CLASSPATH和-classpath参数时,是将当前目录作为查找目录的,就是
d:\>>javac A.java 相当于 d:\>>javac -classpath . A.java若javac 指定了-classpath;我在一本书上看的应该是这样子的解释。当前目录.总是会加在javac的查找目录中的。那么d:\>>javac -classpath d:\my A.java就应该相当于 d:\>>javac -classpath d:\my;. A.java
不知道以上关于javac命令的解释是否成立。实际上用程序调试的时候也证明了这个解释。但不过来看另一个很悖论的问题。这是在看王森的《java 手机程序设计入门》时看到的,实际上上面关于javac的结论也来自这本书。
假设我有一目录为src,

src------
|comtime---------
|Main.java
                            |CA.java
                            |com--------------
|CA.java
    |com----------------
|CA.java源码分别为
src/comtime/Main.java:import com.CA;
public class Main
{
public static void main(String args[])
{
CA ca = new CA() ;
}
}
Src/comtime/CA.javapublic class CA
{
public CA()
{
System.out.println("i am src/comtime/CA");
}
}Src/comtime/com/CA.javapackage com;
public class CA
{
public CA()
{
System.out.println("i am src/comtime/com/CA");
}
}
首先,我在MS-DOS中进入e:\src\comtime目录,以此为起始目录。
输入javac Main.java, 编译通过,得到结果。并运行它:E:\src\comtime>javac Main.javaE:\src\comtime>java Main
i am src/comtime/com/CA
说明javac Main.java是编译了当前目录下e:\src\comime下的com.CA,那指令 javac Main.java 相当于javac –classpath . Main.java是没错的。第二.输入javac –classpath .. Main.java  结果如下E:\src\comtime>javac -classpath .. Main.javaE:\src\comtime>java -classpath ..;. Main
i am /src/com/CA
说明它编译了e:\src\com下的CA.java。
第三.我们把src\com下的CA.java和已生成的CA.class删除,再次输入javac –classpath .. Main.java 看到了什么呢
E:\src\comtime>javac -classpath .. Main.java
Main.java:1: package com does not exist
import com.CA;
           ^
Main.java:8: cannot resolve symbol
symbol  : class CA
location: class Main
CA ca = new CA() ;
^
Main.java:8: cannot resolve symbol
symbol  : class CA
location: class Main
CA ca = new CA() ;
            ^
3 errors出错了,说是找不到com包。根据早先对javac命令所做的解释。Javac会在..目录(src\目录)下找com包,然后再找其中的CA.class。若找不到,它会去找那个隐含的.目录(src\comtime目录)下有没com包,并寻找其中的CA.class。因为当前src\comtime下是有一个com包的。所以照理应该是查找成功的。可是结果并不是这样子。这是否说明javac只是会去找-classpath 指定的位置而不找隐含位置呢。这跟之前得出的javac总会去找隐含目录的结论刚好相反。到底实际怀况是什么样子的呢???

解决方案 »

  1.   


    src------
    |         |comtime---------
          |Main.java
                                     |CA.java
                                     |com--------------
               |CA.java
      |com----------------
         |CA.java
      

  2.   

    楼主的意思是想问问把文件打包及运行是吧?
    怎么跟我知道的有些出入 我们共同切磋
    大致就是:文件定位分两步:
    一:外部定位,   打包后的文件起始路径(是当前目录或者是其他目录等) 
    二 内部路径:即源码中的package <包名>语句, 由<包名指出>
    例如:当前目录为c:\jdk 文件名为demo.java  (其中第一句为package a.b.c)
    打包时  1  javac -d  . demo.java 
             生成的demo.class外部定位为c:\jdk 内部定位为a\b\c 即c:\jdk\a\b\c  
            2  javac -d  d:\java demo.java
            生成的demo.class外部定位为d:\java 内部定位为a\b\c 即d:\java \a\b\c  
    运行时:
       一:外部定位,修改classpath设置即可,无论生成的类文件在什么位置,
        只要将路径写入该环境变量就行~classpath可以在命令行设置 也可以直接修改
        classpath设置
      二 内部路径:即源码中的package <包名>语句,在程序执行时只要用
        <包名>.文件名  ,一切OK
    即  1  java a.b.c.demo
        2  java -classpath d:\java a.b.c.demo
         或者  set classpath=d:\java;%classpath%
                java a.b.c.demo
    呵呵 很怕在学生面前暴露自己的无知,经验告诉我 多看书是有益的~
    一 打包 源文件的第一句指名打包后的具体路径
      

  3.   

    三楼的答案不错,虽然不是我要的。至少让我多懂了一些。我问的其实是javac如果寻找.java文件和.class文件的过程。我自已也没说好。不过我弄懂了。分就给你了。