注意: javac 能够隐式编译一些没有在命令行中说起的源文件。用 -verbose 选项可跟踪自动编译。 java
文件列表
为缩短或简化 javac 命令,能够指定一个或多个每行含有一个文件名的文件。在命令行中,采用 '@' 字符加上文件名的方法将它指定为文件列表。当 javac 遇到以 `@' 字符开头的参数时,它对那个文件中所含文件名的操做跟对命令行中文件名的操做是同样的。这使得 Windows 命令行长度再也不受限制。
例如,能够在名为 sourcefiles 的文件中列出全部源文件的名称。该文件可能形如:
MyClass1.java
MyClass2.java
MyClass3.java
而后可用下列命令运行编译器:
C:> javac @sourcefiles
选项
编译器有一批标准选项,目前的开发环境支持这些标准选项,未来的版本也将支持它。还有一批附加的非标准选项是目前的虚拟机实现所特有的,未来可能要有变化。非标准选项以 -X 打头。
标准选项
-classpath 类路径
设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前目录构成。有关详细信息,请参阅设置类路径。
若未指定 -sourcepath 选项,则将在用户类路径中查找类文件和源文件。
-d 目录
设置类文件的目标目录。若是某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时建立目录。例如,若是指定 -d c:\myclasses 而且该类名叫 com.mypackage.MyClass,那么类文件就叫做 c:\myclasses\com\mypackage\MyClass.class。 编程
若未指定 -d 选项,则 javac 将把类文件放到与源文件相同的目录中。 app
-sourcepath 源路径
指定用以查找类或接口定义的源代码路径。与用户类路径同样,源路径项用分号 (;) 进行分隔,它们能够是目录、JAR 归档文件或 ZIP 归档文件。若是使用包,那么目录或归档文件中的本地路径名必须反映包名。
注意:经过类路径查找的类,若是找到了其源文件,则可能会自动被从新编译。
-verbose
冗长输出。它包括了每一个所加载的类和每一个所编译的源文件的有关信息。
联编选项
缺省状况下,类是根据与 javac 一块儿发行的 JDK 自举类和扩展类来编译。但 javac 也支持联编,在联编中,类是根据其它 Java平台实现的自举类和扩展类来进行编译的。联编时, -bootclasspath 和 -extdirs 的使用很重要;请参阅下面的联编程序示例。
-target 版本
生成将在指定版本的虚拟机上运行的类文件。缺省状况下生成与 1.1 和 1.2 版本的虚拟机都兼容的类文件。JDK 1.2 中的 javac 所支持的版本有:
1.1
保证所产生的类文件与 1.1 和 1.2 版的虚拟机兼容。这是缺省状态。
1.2
生成的类文件可在 1.2 版的虚拟机上运行,但不能在 1.1 版的虚拟机上运行。
-bootclasspath 自举类路径
根据指定的自举类集进行联编。和用户类路径同样,自举类路径项用分号 (;) 进行分隔,它们能够是目录、JAR 归档文件或 ZIP 归档文件。
-extdirs 目录
根据指定的扩展目录进行联编。目录是以分号分隔的目录列表。在指定目录的每一个 JAR 归档文件中查找类文件。 编程语言
-sourcepath 源路径
指定用以查找类或接口定义的源代码路径。与用户类路径同样,源路径项用分号 (;) 进行分隔,它们能够是目录、JAR 归档文件或 ZIP 归档文件。若是使用包,那么目录或归档文件中的本地路径名必须反映包名。
注意:经过类路径查找的类,若是找到了其源文件,则可能会自动被从新编译。
-verbose
冗长输出。它包括了每一个所加载的类和每一个所编译的源文件的有关信息。
联编选项
缺省状况下,类是根据与 javac 一块儿发行的 JDK 自举类和扩展类来编译。但 javac 也支持联编,在联编中,类是根据其它 Java平台实现的自举类和扩展类来进行编译的。联编时, -bootclasspath 和 -extdirs 的使用很重要;请参阅下面的联编程序示例。
-target 版本
生成将在指定版本的虚拟机上运行的类文件。缺省状况下生成与 1.1 和 1.2 版本的虚拟机都兼容的类文件。JDK 1.2 中的 javac 所支持的版本有:
1.1
保证所产生的类文件与 1.1 和 1.2 版的虚拟机兼容。这是缺省状态。
1.2
生成的类文件可在 1.2 版的虚拟机上运行,但不能在 1.1 版的虚拟机上运行。
-bootclasspath 自举类路径
根据指定的自举类集进行联编。和用户类路径同样,自举类路径项用分号 (;) 进行分隔,它们能够是目录、JAR 归档文件或 ZIP 归档文件。
-extdirs 目录
根据指定的扩展目录进行联编。目录是以分号分隔的目录列表。在指定目录的每一个 JAR 归档文件中查找类文件。 工具
非标准选项
-X
显示非标准选项的有关信息并退出。
-Xdepend
递归地搜索全部可得到的类,以寻找要重编译的最新源文件。该选项将更可靠地查找须要编译的类,但会使编译进程的速度大为减慢。
-Xstdout
将编译器信息送到System.out 中。缺省状况下,编译器信息送到 System.err 中。
-Xverbosepath
说明如何搜索路径和标准扩展以查找源文件和类文件。
-J选项
将选项传给 javac 调用的 java 启动器。例如, -J-Xms48m 将启动内存设为 48 兆字节。虽然它不以 -X 开头,但它并非 javac 的‘标准选项’。用 -J 将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。
注意: CLASSPATH 、 -classpath 、 -bootclasspath 和 -extdirs 并 不 指定用于运行 javac 的类。如此滥用编译器的实现一般没有任何意义并且老是很危险的。若是确实须要这样作,可用 -J 选项将选项传给基本的 java 启动器。
程序示例
编译简单程序
一个源文件 Hello.java ,它定义了一个名叫 greetings.Hello 的类。greetings 目录是源文件和类文件二者的包目录,且它不是当前目录。这让咱们可使用缺省的用户类路径。它也使咱们不必用 -d 选项指定单独的目标目录。
C:> dir
greetings/
C:> dir greetings
Hello.java
C:> cat greetings\Hello.java
package greetings;
public class Hello {
public static void main(String[] args) {
for (int i=0; i < args.length; i++) {
System.out.println("Hello " + args[i]);
}
}
}
C:> javac greetings\Hello.java
C:> dir greetings
Hello.class Hello.java
C:> java greetings.Hello World Universe Everyone
Hello World
Hello Universe
Hello Everyone
编译多个源文件
该示例编译 greetings 包中的全部源文件。
C:> dir
greetings\
C:> dir greetings
Aloha.java GutenTag.java Hello.java Hi.java
C:> javac greetings\*.java
C:> dir greetings
Aloha.class GutenTag.class Hello.class Hi.class
Aloha.java GutenTag.java Hello.java Hi.java
指定用户类路径
对前面示例中的某个源文件进行更改后,从新编译它:
C:> cd
\examples
C:> javac greetings\Hi.java
因为 greetings.Hi 引用了 greetings 包中其它的类,编译器须要找到这些其它的类。上面的示例能运行是由于缺省的用户类路径恰好是含有包目录的目录。可是,假设咱们想从新编译该文件而且不关心咱们在哪一个目录中的话, 咱们须要将 \examples 添加到用户类路径中。能够经过设置 CLASSPATH 达到此目的,但这里咱们将使用 -classpath 选项来完成。
C:>javac -classpath \examples \examples\greetings\Hi.java
若是再次将 greetings.Hi 改成使用标题实用程序,该实用程序也须要经过用户类路径来进行访问:
C:>javac -classpath \examples:\lib\Banners.jar \
\examples\greetings\Hi.java
要执行 greetings 中的类,须要访问 greetings 和它所使用的类。 优化
C:>java -classpath \examples:\lib\Banners.jar greetings.Hi 编码
将源文件和类文件分开
将源文件和类文件置于不一样的目录下常常是颇有意义的,特别是在大型的项目中。咱们用 -d 选项来指明单独的类文件目标位置。因为源文件不在用户类路径中,因此用 -sourcepath 选项来协助编译器查找它们。
C:> dir
classes\ lib\ src\
C:> dir src
farewells\
C:> dir src\farewells
Base.java GoodBye.java
C:> dir lib
Banners.jar
C:> dir classes
C:> javac -sourcepath src -classpath classes:lib\Banners.jar \
src\farewells\GoodBye.java -d classes
C:> dir classes
farewells\
C:> dir classes\farewells
Base.class GoodBye.class
注意:编译器也编译了 src\farewells\Base.java,虽然咱们没有在命令行中指定它。要跟踪自动编译,可以使用 -verbose 选项。
联编程序示例
这里咱们用 JDK 1.2 的 javac 来编译将在 1.1 版的虚拟机上运行的代码。 spa
C:> javac -target 1.1 -bootclasspath jdk1.1.7\lib\classes.zip \
-extdirs "" OldCode.java
-target 1.1 选项可确保生成的类文件与 1.1 版的虚拟机兼容。在 JDK1.2 中, 缺省状况下 javac 编译生成的文件是与 1.1 版的虚拟机兼容的,所以并不是严格地须要该选项。然而,因为别的编译器可能采用其它的缺省设置,因此提供这一选项将不失为是个好习惯。
JDK 1.2 javac 在缺省状态下也将根据 1.2 版的自举类来进行编译,所以咱们须要告诉 javac 让它根据 JDK 1.1 自举类来进行编译。可用 -bootclasspath 和 -extdirs 选项来达到此目的。不这样作的话,可能会使编译器根据 1.2 版的 API 来进行编译。因为 1.1 版的虚拟机上可能没有该 1.2 版的 API,所以运行时将出错
命令行