Javac
[ options ] [ sourcefiles ] [ @files ]
参数可按任意次序排列。
options
命令行选项。
sourcefiles
@files
编辑本段说明
两种方法
源代码
文件名称必须含有 .java 后缀,类文件名称必须含有 .class 后缀,
源文件
和类文件都必须有识别该类的根名。例如,名为 MyClass 的类将写在名为 MyClass.java的
源文件
中,并被编译为
字节码
类文件 MyClass.class。
应当将
源文件
安排在反映其包树结构的目录树中。例如,如果将所有的
源文件
放在 /workspace 中,那么 com.mysoft.mypack.MyClass 的代码应该在 \workspace\com\mysoft\mypack\MyClass.java 中。
查找类型
当编译
源文件
时,
编译器
常常需要它还没有识别出的类型的有关信息。对于
源文件
中使用、扩展或实现的每个类或接口,
编译器
都需要其类型信息。这包括在
源文件
中没有明确提及、但通过继承提供信息的类和接口。
例如
当扩展 java.applet.Applet 时还要用到 Applet 的祖先类:java.awt.Panel 、 java.awt.Container、 java.awt.Component 和 java.awt.Object。
当
编译器
需要类型信息时,它将查找定义类型的
源文件
或类文件。
编译器
先在自举类及扩展类中查找,然后在用户类路径中查找。用户类路径通过两种途径来定义:通过设置 CLASSPATH
环境变量
或使用 -classpath 命令行选项。(有关详细资料,请参阅设置类路径)。如果使用 -sourcepath 选项,则
编译器
在 sourcepath 指定的路径中查找
源文件
;否则,编译器将在用户类
路径
中查找类文件和
源文件
。可用-bootclasspath 和 -extdirs 选项来指定不同的自举类或扩展类;参阅下面的联编选项。
搜索结果只生成类文件而没有源文件: javac 使用类文件。
缺省情况下
注意
javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译。
文件列表
为缩短或简化 javac 命令,可以指定一个或多个每行含有一个文件名的文件。在命令行中,采用 '@'
字符
加上文件名的方法将它指定为文件列表。当 javac 遇到以 `@'
字符
开头的参数时,它对那个文件中所含文件名的操作跟对命令行中文件名的操作是一样的。这使得 Windows 命令行长度不再受限制。
MyClass1.java
MyClass2.java
MyClass3.java
C:> javac @sourcefiles
编辑本段选项
标准选项
-classpath 类路径
设置用户类的路径,它会覆盖 CLASSPATH
环境变量
中的用户类
路径
。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由
当前目录
构成。有关详细信息,请参阅设置类路径。
若未指定 -sourcepath 选项(见下文),则将在用户类路径中查找类文件和源文件。
-d 目录
设置输出类文件的位置。如果某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时创建目录。例如,如果指定 -d c:\myclasses 并且该类名叫 com.mypackage.MyClass,那么类文件就叫作 c:\myclasses\com\mypackage\MyClass.class。
注意: -d 选项指定的目录不会被自动添加到用户类路径中。
-deprecation
-encoding
-g
-g:none
不生成任何调试信息。
-g:{关键字列表}
只生成某些类型的调试信息,这些类型由逗号分隔的关键字列表所指定。有效的关键字有:
source
源文件调试信息
lines
行号调试信息
vars
局部变量
调试信息
-nowarn
禁用警告信息。
-O
优化代码,缩短执行时间。使用 -O 选项可能使编译速度下降,生成更大的类文件并使程序难以调试。
在 JDK 1.2 以前的版本中,javac 的 -g 选项和 -O 选项不能一起使用。在 JDK 1.2 中,可以将 -g 和 -O 选项结合起来,但可能会得到意想不到的结果,如丢失
变量
或重新定位代码或丢失代码。-O 选项不再自动打开 -depend 或关闭 -g 选项。同样, -O 选项也不再允许进行跨类内嵌。
-sourcepath 源路径
指定用来查找类或接口定义的
源代码
路径
。与用户类
路径
一样,多个源路径项用分号 “ ; ” 进行分隔,它们可以是目录、JAR 归档文件或 ZIP 归档文件。如果使用包,那么目录或归档文件中的
本地路径
名必须反映包名。(注意:通过类
路径
查找的类,如果找到了其
源文件
,则可能会自动被重新编译。)
-verbose
联编选项
缺省情况下,类是根据与 javac 一起发行的 JDK 自举类和扩展类来编译。但 javac 也支持联编,在联编中,类是根据其它
Java平台
实现的自举类和扩展类来进行编译的。联编时, -bootclasspath 和 -extdirs 的使用很重要;请参阅下面的联编程序示例。
-target 版本
1.1
1.2
-bootclasspath 自举类路径
-extdirs 目录
根据指定的扩展目录进行联编。目录是以分号分隔的目录列表。在指定目录的每个 JAR 归档文件中查找类文件。
非标准选项
-X
显示非标准选项的有关信息并退出。
-Xdepend
递归地搜索所有可获得的类,以寻找要重编译的最新源文件。该选项将更可靠地查找需要编译的类,但会使编译进程的速度大为减慢。
-Xstdout
-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);
}
}
}
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
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
联编程序示例
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,因此运行时将出错。
编辑本段另请参阅
java
jdb
javah
- C 头文件和 stub 文件生成器
javap
- 类文件解析器
javadoc
- API 文档生成器
jar
- JAR 归档工具 Java 扩展框架
转载于:https://blog.51cto.com/375163948/1274876