package、import 的相关问题是java中的一个不大不小的问题,但classpath问题却是java的一个著名的难题。今晚得闲研究了一下,在这里将我的研究成果跟各位 朋友分享一下。由于同包的情况很简单,所以这里就不讨论同包情况,只讨论不同包和不同路径的情况。为了能让读者更容易理解,我这里以举例的方式来说明问 题。
假设在路径E:/share下写了两个类,它们分别是Book.java和Paper.java,代码如下:
Book.java :
package p1;
public class Book {
public static void main(String[] args) {
p2.Paper p = new p2.Paper(); //line 5
p.helloworld();
}
}
Paper.java :
package p2;
public class Paper {
public void helloworld(){
System.out.println("HelloWorld");
}
}
Book类和Paper是 位于同一路径(E:/share)下的,但他们不同包 。那 么,我们应该如果运行Book呢?正确的流程如下:
1、打开cmd,进入E:/share路径下;
2、编译Paper类:javac Paper.java,
编译Book类:javac Book.java;
3、在E:/share下新建两个包p1,p2,将编译所得的两个类文件Book.class和Paper.class分别放入p1和p2中,这一步非常 关键;
4、运行Book类:java p1.book.java;
可以看到运行结果:HelloWorld。这说明已经正确运行了Book类。
回头看一下Book.java类,标记line 5那行创建了一个Paper类的对象p,但创建时稍微有一麻烦,因为Paper类要写全包名,如果包名很长的话,既不直观又麻烦。所以,java提供了 import关键字,它的作用是将其它包的类导入到当前类里。上面的Book.java可以这样写:
Book.java :
package p1;
import p2.Paper; //line 2
public class Book {
public static void main(String[] args) {
Paper p = new Paper(); //line 5
p.helloworld();
}
}
在line 2导入Paper类,line 5创建Paper对象时就不用写全包名了。这时Book类运行的方式还跟上面的方式一样。
上面的例子里,Book类和Paper类是位于同一路径下的。那么,位于 不同路径下的情况 又 如何呢?这里就涉及到classpath的问题啦。下面仍以举例的方式来说明。
Paper类和Book类的代码仍与上面的代码一样,只不过它们的类路径改变了。
在E:/share下的文件是这样放置的:
文件夹p1里放着Book类的class文件,文件夹tp的情况如下:
文件夹p2里放着Paper类的class文件。
这种情况下,Book类和Paper类位于不同路径下。运行Book类就不能用上面的方法了。正 确的方式是:
1、编译Book类和Paper类,将编译所得的class文件分别置于p1和p2下;
2、打开环境变量设置窗口,在 classpath里加多一个路径E:/share/tp(Paper 最上层包所在的目录下 ), 具体情况如下图所示:
3、 重启cmd ,运行Book类:java p1.Book ; 输出结果仍然是HelloWorld,说明运行正确。需要强调的是, Book类的class文件放在系统的 任何路径下,都可以通过设置环境变量访问到Paper类!
类Book要使用类Paper,除了将类Paper所在路径设置环境变量的方式外,还可以有以下方式。下面我仍然举个例子:
Book.java :
package p1;
import p2.Paper;
public class Book {
public static void main(String[] args) {
Paper p = new Paper();
p.helloworld();
}
}
Paper.java :
package p2;
public class Paper {
public void helloworld(){
System.out.println("HelloWorld");
}
}
代 码如上,将Paper.java放在E:/share路径下,Book.java放在任何路径 下。 编译这两个类,将得到的class文件分别相应目录下相应的包里(Paper.class放在p2下,Book.class放在p1下),运行方法如下:
1、 将p2打包:打开cmd,进入E:/share路径下,输入jar -cvf test.jar *.* 。这样就将share路径下的所有文件打包成test.jar(将Paper连同全包一起打包在E:/share下)。然后设置环境变量:E: /share/test.jar,如下图所示:
设置完成后,重启cmd,就可以在 任何路径 下运行Book类:java p1.Book 。
这里我们得到的启示是:如果我们接到一个项目,那么当项目完成后,我们就可以将其所有的class文件打包,然后交给企业,企业只需设置环境变量,就可以 直接使用我们开发的项目了。
其实访问不同路径下的类,除了通过设置环境变量外,还有其他的方式。上例中,将Paper.java编译,将得到的Paper.class放入 p2包中,然后将p2打包成test.jar文件,再将test.jar放入到%JAVA_HOME%/jre/lib/ext下,Book类便可访问到 Paper类,即Book类可顺利编译和运行。
补充:可以这样编译Book类:java -class e:/share/test.jar Book.java ,其中test.jar是Paper的压缩包。