【java】javac编译class文件

javac编译class文件

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

情况① :
    直接用javac命令编译两个源文件(先编译被依赖的类A,再编译类B),结果如下:


    可以看到编译成功,生成了对应的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目录的上一级子目录。
    修改命令行,编译结果如下:
     
可以看到,编译成功。 

通过对以上三种情况的分析,这里总结如下:
(1)利用javac进行编译时,默认情况下的类搜索路径为当前路径。
(2)如果类中包含了Java标准类库中以外的类,则需要利用-cp参数指定类搜索路径。
(3)如果需要的类指定了类所在的包,那么-cp参数指定的类搜索路径应包含该类所在的包。

发布了101 篇原创文章 · 获赞 117 · 访问量 48万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览