关于java的classpath问题


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的压缩包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值