编译程序(javac)与SOURCEPATH

2.2 管理原始码与位码文档

来观察一下目前你的C:\workspace,原始码(.java)文档与位码文档(.class)都放在一起,想象一下,如果程序规模稍大,一堆.java与.class文档还放在一起,会有多么混乱,你需要有效率地管理原始码与位码文档。

2.2.1 编译程序(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所示。

编译程序(javac)与SOURCEPATH_第1张图片 
图2.18  指定-sourcepath与-d进行编译
在编译src/Main.java时,由于程序代码中要使用到Console类,你必须告诉编译程序,Console类的原始码文档存放位置。这里使用-sourcepath指定从src文件夹中寻找原始码文档,而-d指定了编译完成的位码存放文件夹,编译程序会将使用到的相关类原始码也一并进行编译,编译完成后,会在classes文件夹中看到Console.class与Main.class文档。可以执行图2.19所示的程序。
编译程序(javac)与SOURCEPATH_第2张图片 
图2.19  指定执行classes中的Main类
可以在编译时指定-verbose自变量,看到编译程序进行编译时的过程,有助于了解SOURCEPATH与CLASSPATH的差别,如图2.20所示。
编译程序(javac)与SOURCEPATH_第3张图片 
图2.20  编译时指定-verbose

就初学者而言,最主要看看圈住的部分,在编译时,会先搜索-sourcepath指定的文件夹(上例指定src)u是不是有使用到的类原始码,然后会搜索CLASSPATH中,是否有已编译的类位码v。你可以发现,其实默认搜索位码的路径包括许多默认的JAR文档,像是rt.jar等,留意最后那个".",由于没有指定-classpath(-cp),默认会搜索目前路径。

确认原始码与位码搜索路径之后,接着检查CLASSPATH中是否已经有编译完成的Main类,如果存在且从上次编译后,Main类的原始码并没有改变,则无须重新编译,如果不存在,则重新编译Main类。就上例而言,由于CLASSPATH并不包括classes文件夹,所以找不到Main类位码,因此重新编译出Main.class并存放至classes中w。

接着检查CLASSPATH中是否已经有编译完成的Console类,如果存在且从上次编译后,Console类的原始码并没有改变,则无须重新编译,如果不存在,则重新编译Console类。就上例而言,由于CLASSPATH并不包括classes文件夹,所以找不到Console类位码,因此重新编译出Console.class并存放至classes中x。

实际项目中会有数以万计的类,如果每次都要重新将.java编译为.class,那会是非常费时的工作,所以编译时若类路径中已存在位码,且上次编译后,原始码并没有修改,无须重新编译会比较节省时间。因此,就上例而言,应该指定-cp为classes,如图2.21所示。

编译程序(javac)与SOURCEPATH_第4张图片 
图2.21  编译时指定-sourcepath与-cp

注意,这次指定了-sourcepath为src,而-cp为classes,所以会在src中搜索位原始码文档u,在classes中搜索位码文档v(注意最后的classes)。由于CLASSPATH中包括classes文件夹,所以找到Console类位码,因此无须重新编译Console.class,而只编译javac指定的Main.java为Main.classw。

JVM默认的类搜索路径,也就是那些JAR文档的搜索路径,其实与类加载器有关,这是个进阶议题,第15章会加以讨论。

原文:http://book.51cto.com/art/201204/330536.htm

你可能感兴趣的:(java)