来观察一下目前你的C:\workspace,原始码(.java)文档与位码文档(.class)都放在一起,想象一下,如果程序规模稍大,一堆.java与.class文档还放在一起,会有多么混乱,你需要有效率地管理原始码与位码文档。
编译程序(javac)与SOURCEPATH
首先必须解决原始码文档与位码文档都放在一起的问题。请将光盘中labs文件夹的Hello1文件夹复制至C:\workspace中,Hello1文件夹中有src与classes文件夹,src文件夹中有Console.java与Main.java两个文档,其中Console.java就是2.1.4节中Console类的原始码(目前你不用关心它如何撰写),而Main.java的内容与图2.14相同。
简单地说,src文件夹将用来放置原始码文档,而编译好的位码文档,希望能指定存放至classes文件夹。可以在“命令提示符”模式下,切换至Hello1文件夹,然后进行编译,如图2.18所示。
编译时指定-verbose
就初学者而言,最主要看看圈住的部分,在编译时,会先搜索-sourcepath指定的文件夹(上例指定src)是不是有使用到的类原始码,然后会搜索CLASSPATH中,是否有已编译的类位码。你可以发现,其实默认搜索位码的路径包括许多默认的JAR文档,像是rt.jar等,留意最后那个“.”,由于没有指定-classpath(-cp),默认会搜索目前路径。
确认原始码与位码搜索路径之后,接着检查CLASSPATH中是否已经有编译完成的Main类,如果存在且从上次编译后,Main类的原始码并没有改变,则无须重新编译,如果不存在,则重新编译Main类。就上例而言,由于CLASSPATH并不包括classes文件夹,所以找不到Main类位码,因此重新编译出Main.class并存放至classes中。
接着检查CLASSPATH中是否已经有编译完成的Console类,如果存在且从上次编译后,Console类的原始码并没有改变,则无须重新编译,如果不存在,则重新编译Console类。就上例而言,由于CLASSPATH并不包括classes文件夹,所以找不到Console类位码,因此重新编译出Console.class并存放至classes中。
实际项目中会有数以万计的类,如果每次都要重新将.java编译为.class,那会是非常费时的工作,所以编译时若类路径中已存在位码,且上次编译后,原始码并没有修改,无须重新编译会比较节省时间。因此,就上例而言,应该指定-cp为classes,如图2.21所示。
JVM默认的类搜索路径,也就是那些JAR文档的搜索路径,其实与类加载器有关,这是个进阶议题,第15章会加以讨论。
互动网: http://product.china-pub.com/199212
当当网: http://product.dangdang.com/product.aspx?product_id=22643687
作者: 林信良
出版社:清华大学出版社
ISBN:9787302282082
上架时间:2012-4-1
出版日期:2012 年4月
开本:16开页码:562
版次:1-1