今天,笔者遇到了一个小问题:在使用原始的javac编译Java类文件时,如果当前类文件对其他类有依赖,那么,就可能会出现问题。
举例如下:笔者在桌面新建一个文件夹test,然后建立两个类:A.java和B.java,如下图:
两个类的代码都很简单,其中B类对A类有依赖:
然后,我们分3种情况分析:
情况① :
直接用javac命令编译两个源文件,结果如下:


可以看到编译成功,生成了对应的class文件。
情况②:
删去情况①中生成的class文件,我们在B.java中利用import语句导入一个包:

然后重新编译这两个文件,结果如下:
可以看到,B.java文件编译失败,这是因为javax.servlet.*包并非Java标准类库中的内容,因此编译器找不到对应的包,就会出错。
我们将需要的jar文件放入当前目录,并使用-cp参数将库文件导入,然后继续编译:
编译结果如下:
此时,依旧编译失败,但提示的是找不到类A,这是因为,默认情况下,编译器会在当前目录下寻找需要的类文件,我们使用cp参数修改了类文件查找路径,而并没有包含当前目录,因此,编译失败。我们在使用cp参数时,需要将当前目录包含进去:
可以看到编译成功。
情况③:
删除情况②生成的class文件,我们在A.java和B.java文件中添加package语句,将文件夹test记录在代码中:

继续使用情况②中编译成功的命令来编译,结果如下:

可以看到,编译器再一次找不到类A,这是因为,添加了package语句后,编译器需要找的是test.A类,编译器会首先找到test目录,然后再从test目录中找到A,此时当前目录中(test目录内)不存在test子目录,因此,编译器找不到A类,编译失败。这说明我们包含的类路径需要包括类所在的包,这里需要包含test目录的上一级子目录。
修改命令行,编译结果如下:
可以看到,编译成功。
通过对以上三种情况的分析,这里总结如下:
举例如下:笔者在桌面新建一个文件夹test,然后建立两个类:A.java和B.java,如下图:
两个类的代码都很简单,其中B类对A类有依赖:
情况① :
直接用javac命令编译两个源文件,结果如下:
情况②:
删去情况①中生成的class文件,我们在B.java中利用import语句导入一个包:
我们将需要的jar文件放入当前目录,并使用-cp参数将库文件导入,然后继续编译:
情况③:
删除情况②生成的class文件,我们在A.java和B.java文件中添加package语句,将文件夹test记录在代码中:
修改命令行,编译结果如下:
通过对以上三种情况的分析,这里总结如下:
(1)利用javac进行编译时,默认情况下的类搜索路径为当前路径。(2)如果类中包含了Java标准类库中以外的类,则需要利用-cp参数指定类搜索路径。(3)如果需要的类指定了类所在的包,那么-cp参数指定的类搜索路径应包含该类所在的包。