classpath总结
classpath表示类(.class文件)的路径,在dos环境下使用时有如下情况:
第一种情况,未命名包时(不加package):
在e盘建个demo的文件夹,在demo下建立a、b、c三个文件夹,在b下建立一个B.java文件如下:
public class B{
public String sayHi(String name) {
return "Hi!" + name;
}
}
在a下建立一个A.java文件,A类中引用了B类,如下:
import java.util.Date;
public class A{
public static void main(String[] args) {
System.out.println(new B().sayHi("zhangsan"));
System.out.println(new Date());
}
}
在dos环境下切换到e:/demo/a下,使用javac A.java报错:

因为默认的classpath是在当前目录下找,找不到B类,所以通过-classpath+路径名给classpath指定类路径,使用javac -classpath e:/demo/b A.java:


继续执行java A报错:

原因是-classpath是临时指定类路径,使用java -classpath e:/demo/b A提示找不到A类:

需要在路径中加分号(;),分号表示当前目录,分号在前表示先在当前目录下找后到指定目录找,即java -classpath ;e:/demo/b A或java -classpath e:/demo/b; A:

如果执行javac B.java,会提示找不到文件B.java,需要输入文件的绝对路径如下:

第二种情况,命名包时(加入package):
A.java修改如下:
package a;
import java.util.Date;
import b.B;
public class A{
public static void main(String[] args) {
System.out.println(new B().sayHi("zhangsan"));
System.out.println(new Date());
}
}
B.java修改如下:
package b;
public class B{
public String sayHi(String name) {
return "Hi!" + name;
}
}
在dos环境下切换到e:/demo/a下,使用javac A.java报错:

因为import导入时,先在当前目录下找b,没找到,所以使用javac -classpath e:/demo A.java:

或者切换到e:/demo,使用相对路径javac a/A.java:

在e:/demo/a下执行java A提示找不到A:

因为此时命令相当于在当前目录下先找a,再找A即E:\demo\a\a\A.java,重复了,所以要切换到e:/demo下使用java a.A:

此处要使用A类的全名称,即加包名,也不用-classpath指定B类的路径,上面说过import导入时会在当前目录下依次找。
将b文件夹移动到c文件夹下,在e:/demo/a下执行javac -classpath e:/demo A.java报错:

要改为javac -classpath e:/demo/c A.java:

切换到e:/demo,使用相对路径javac a/A.java报错:

此时应改为javac -classpath e:/demo/c a/A.java:

在e:/demo下执行java a.A报错:

修改为java -classpath ;e:/demo/c a.A或java -classpath e:/demo/c; a.A:

最后,编译时如果有包名,-classpath要指定到包名的父目录,比如B.java在包b下,-classpath指定为e:/demo/c而不是e:/demo/c/b;执行时如果有包名,要加上包路径比如java a.A、java b.B。

浙公网安备 33010602011771号