命令结构
javac [ options ] [ sourcefiles ]|[ @files ]
参数可按任意次序排列。
options
命令行选项。
sourcefiles
一个或多个要编译的源文件(例如 MyClass.java)。
@files
一个或多个对源文件进行列表的文件。
结构说明
该命令实际上由两部分组成。
1.需要被编译的源文件。
有两种方法可将源代码文件名传递给 javac:
如果源文件数量少,在命令行上列出文件名即可(可以为相对路径,也可以为绝对路径)。
如果源文件数量多,则将源文件名列在一个文件中,名称间用空格或回车行来进行分隔。然后在 javac 命令行中使用该列表文件名,文件名前冠以 @ 字符。
2.可选项。
可选项包括编译后的class文件存放路径、编译源文件所依赖的外部类(可以为class文件,也可以为java文件)、编译源文件所依赖的JDK自举类和扩展类等等。
常用可选项如下:
-classpath 类路径
设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前目录构成。
-d 目录
设置生成的类文件的存放目录。如果某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时创建目录。
例如,如果指定 -d c:\myclasses 并且该类名叫 com.mypackage.MyClass,那么类文件就叫做c:\myclasses\com\mypackage\MyClass.class。若未指定 -d 选项,则 javac 将把类文件放到与源文件相同的目录中。
-sourcepath 源路径
指定用以查找类或接口定义的源代码路径。与用户类路径一样,源路径项用分号 (;) 进行分隔,它们可以是目录、JAR 归档文件或 ZIP 归档文件。
-s 目录
指定存放生成的源文件的位置。这个选项很有意思,编译后应该生成class文件,为什么还会生成源文件呢?官方文档是这么说的:
Specify the directory where to place generated source files. The directory must already exist; javac will not create it. If a class is part of a package, the compiler puts the source file in a subdirectory reflecting the package name, creating directories as needed. For example, if you specify -s /home/mysrc and the class is called com.mypackage.MyClass, then the source file will be placed in /home/mysrc/com/mypackage/MyClass.java.
另外网上有这样的解说:
这个玩意儿可用在java注解处理器生成新的文件中,具体的请结合javax.annotation.processing这个包的作用看下。我的理解就是通过在源码中配置注解处理器,根据相应的注解处理器生成部分代码。
所以这个选项应该很少用到。
-bootclasspath 自举类路径
根据指定的自举类集进行联编。和用户类路径一样,自举类路径项用分号 (;) 进行分隔,它们可以是目录、JAR 归档文件或 ZIP 归档文件。默认为$JAVA_HOME\jdk\jre\lib目录
-extdirs 目录
根据指定的扩展目录进行联编。目录是以分号分隔的目录列表。在指定目录的每个 JAR 归档文件中查找类文件。默认为$JAVA_HOME\jdk\jre\lib\ext目录
关于类型查找(依赖查找)
当编译源文件时,编译器常常需要它还没有识别出的类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口,编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。
例如,当扩展 java.applet.Applet 时还要用到 Applet 的祖先类:java.awt.Panel 、 java.awt.Container、 java.awt.Component 和 java.awt.Object。
当编译器需要类型信息时,它将查找定义类型的源文件或类文件。编译器先在自举类及扩展类中查找,然后在用户类路径中查找。用户类路径通过两种途径来定义:通过设置 CLASSPATH 环境变量或使用 -classpath 命令行选项。如果使用 -sourcepath 选项,则编译器在 sourcepath 指定的路径中查找源文件;否则,编译器将在用户类路径中查找类文件和源文件。
可用-bootclasspath 和 -extdirs 选项来指定不同的自举类或扩展类
简单的例子
JDK安装在D:\Program Files目录下,设置了PATH环境变量,但是没有设置CLASSPATH环境变量。
现在有一个类源文件如下:
package org.zzj.test;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello world!");
}
}
注意包名是org.zzj.test。
一般文件的存放路径应该与包名相对应。
将该源文件存放到E:\JavaTest\src\org\zzj\test目录下。
打开命令行窗口,切换到F盘下,运行如下命令:
F:\>javac E:\JavaTest\src\org\zzj\test\HelloWorld.java -d E:\JavaTest\bin
由于该类只依赖了JDK自举类,所以不必指定classpath。
生成的class文件路径:
自动创建了目录org/zzj/test
运行class文件:
F:\>java -classpath E:\JavaTest\bin org.zzj.test.HelloWorld
因为当前目录为F盘的根目录,并且又没有设置CLASSPATH,而需要运行的class文件位于另一个目录,所以需要指定classpath。
注意:类名必须使用全限定名。