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:demoaaA.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。

原文地址:https://www.cnblogs.com/lirun/p/10368953.html