我们来做个实验:假如我们要做个系统,并将整个系统放到一个project的文件夹中。
例如我们在d:目录下建个project的目录,此时相对于我们这个系统而言,我们这个系统就可以看做是一个大的包,我们知道包的意思就是类库的意思,也就是说是顶包的意思,而这个顶包就在project的目录下,d:/project是该系统的根目录,这个很重要,必须明确,因为在我们用javac编译时,使用-classpath时相对的就是这个目录,-classpath后面跟的文件或者目录都是处于顶包之下的。
实验开始:
在project目录下,用以下内容建一个java文件:
- package com.abc.zyj;
- public class M
- {}
- class G
- {}
注意该java文件名为M.java
分析:在java中要找到一个class的话,需要给出该calss的全部限定名。限定名就是包名+类名。在上面package的作用可以看做是给类分块,即把类M和类G划归为com.abc.zyj块,当然实际当中,可以按照项目系统的需要划分。所以类M的完全限定名是com.abc.zyj.M。
现在开始编译:
命令行中:
上面的语句是在当前的目录下编译该java文件。
查看该目录,可以发现编译器在该目录下产生了一个com目录,com目录下又有一个abc目录,abc目录又有一个zyj目录,而zyj目录下又含有2个class文件,即M.class和G.class。
注意上面的语句,-d .这个不能少,如果少了的话,编译产生的class文件将只出现在当前目录,而不会产生目录结构。
由于java中的打包是按照目录结构进行操作的,所以上面应该很容易理解。
现在开始对这2个class文件进行压缩打包。
在命令行窗口中进入project目录下
使用
即在project目录下生成一个zyj.jar的包
上面命令行的命令的意思可以理解为对com文件夹进行压缩,你可以用winrar对该文件进行查看,就可以看到里面有个类似com/abc/zyj的结构
现在包完成了,如何引用了包呢?这个就要理解classpath的意义了,一定要记住classpath指的在顶包下进行寻找。
继续实验:
在project目录下建一个java文件,内容如下:
- import com.abc.zyj.M;
- public class Hello
- {
- public static void main(String args)
- {
- M a=new M();
- System.out.println(a.toString());
- }
- }
上面这些语句中的import作用是告诉java编译器如何查找某个类,因为jar本身是个压缩文件,文件内部包含了com/abc/zyj结构,就相当于在根目录下有com/abc/zyj等目录结构,所以这里相当于首先从根目录开始,查找com目录,然后在com目录下查找abc目录,然后在abc目录查找zyj目录,最后在zyj目录下查找M这个类,即按照com.abc.zyj.M这个顺序去查找的
所以在这里一定明确classpath指的意思,以及包中的结构划分是按照目录结构来划分的
编译上面的类的命令行命令如下:
注意在导包的时候一定要注意字母的大小写,即可以查看下jar文件内的目录结构的字母大小,这样在导包的时候才会不会出错