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。