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总会去找隐含目录的结论刚好相反。到底实际怀况是什么样子的呢???
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总会去找隐含目录的结论刚好相反。到底实际怀况是什么样子的呢???
src------
| |comtime---------
|Main.java
|CA.java
|com--------------
|CA.java
|com----------------
|CA.java
怎么跟我知道的有些出入 我们共同切磋
大致就是:文件定位分两步:
一:外部定位, 打包后的文件起始路径(是当前目录或者是其他目录等)
二 内部路径:即源码中的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
呵呵 很怕在学生面前暴露自己的无知,经验告诉我 多看书是有益的~
一 打包 源文件的第一句指名打包后的具体路径