命令结构

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文件路径:

javac 命令提示符 javac命令详解_源文件

自动创建了目录org/zzj/test

运行class文件:

F:\>java -classpath E:\JavaTest\bin org.zzj.test.HelloWorld

因为当前目录为F盘的根目录,并且又没有设置CLASSPATH,而需要运行的class文件位于另一个目录,所以需要指定classpath。

注意:类名必须使用全限定名。