JAVAC命令使⽤⽅法
结构
javac [ options ] [ sourcefiles ] [ @files ]
參数可按随意次序排列。
options
命令⾏选项。
sourcefiles
⼀个或多个要编译的源⽂件(⽐如 MyClass.java)。
@files
⼀个或多个对源⽂件进⾏列表的⽂件。
说明
javac
有两种⽅法可将源码⽂件名称传递给 javac:
假设源⽂件数量少,在命令⾏上列出⽂件名称就可以。
假设源⽂件数量多,则将源⽂件名称列在⼀个⽂件⾥,名称间⽤空格或回车⾏来进⾏分隔。然后在 javac 命令⾏中使⽤该列表⽂件名称,⽂件名称前冠以 @ 字符。
源码⽂件名称称必须含有 .java 后缀,类⽂件名称称必须含有 .class 后缀,源⽂件和类⽂件都必须有识别该类的根名。⽐如,名为 MyClass 的类将写在名为MyClass.java的源⽂件⾥,并被编译为字节码类⽂件 MyClass.class。
内部类定义产⽣附加的类⽂件。这些类⽂件的名称将内部类和外部类的名称结合在⼀起,⽐如 MyClass$MyInnerClass.class。
应当将源⽂件安排在反映其包树结构的⽂件夹树中。⽐如,假设将全部的源⽂件放在 /workspace 中,那
么 pack.MyClass 的代码应该在 \workspace\com\mysoft\mypack\MyClass.java 中。
缺省情况下,编译器将每⼀个类⽂件与其源⽂件放在同⼀⽂件夹中。可⽤ -d 选项(请參阅后⾯的)指定其他⽬标⽂件夹。
⼯具读取⽤ 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 使⽤类⽂件。
搜索结果仅仅⽣成源⽂件⽽沒有类⽂件: javac 编译源⽂件并使⽤由此⽣成的类⽂件。
搜索结果既⽣成源⽂件⼜⽣成类⽂件:确定类⽂件是否过时。若类⽂件已过时,则 javac ⼜⼀次编译源⽂件并使⽤更新后的类⽂件。否则, javac 直接使⽤类⽂件。
缺省情况下,仅仅要类⽂件⽐源⽂件旧, javac 就觉得它已过时。( -Xdepend 选项指定相对来说较慢但却⽐較可靠的过程。)
javac
注意: javac 能够隐式编译⼀些沒有在命令⾏中提及的源⽂件。⽤ -verbose 选项可跟踪⾃⼰主动编译。
⽂件列表
为缩短或简化 javac 命令,能够指定⼀个或多个每⾏含有⼀个⽂件名称的⽂件。在命令⾏中,採⽤ '@'
字符加上⽂件名称的⽅法将它指定为⽂件列表。当 javac 遇到以 `@' 字符开头的參数时,它对那个⽂件⾥所含⽂件名称的操作跟对命令⾏中⽂件名称的操作是⼀样的。这使得 Windows 命令⾏长度不再受限制。
⽐如,能够在名为 sourcefiles 的⽂件⾥列出全部源⽂件的名称。该⽂件可能形如:
MyClass1.java
MyClass2.java
MyClass3.java
然后可⽤下列命令执⾏编译器:
C:> javac @sourcefiles
选项
编译器有⼀批标准选项,眼下的开发环境⽀持这些标准选项,将来的版本号也将⽀持它。另⼀批附加的⾮标准选项是眼下的虚拟机实现所特有的,将来可能要有变化。⾮标准选项以 -X 打头。
标准选项
-classpath 类路径
设置⽤户类路径,它将覆盖 CLASSPATH 环境变量中的⽤户类路径。若既未指定 CLASSPATH ⼜未指定 -classpath,则⽤户类路径由当前⽂件夹构成。有关具体信息,请參阅设置类路径。
若未指定 -sourcepath 选项,则将在⽤户类路径中查类⽂件和源⽂件。
-d ⽂件夹
设置类⽂件的⽬标⽂件夹。假设某个类是⼀个包的组成部分,则 javac 将把该类⽂件放⼊反映包名的⼦⽂件夹中,必要时创建⽂件夹。⽐如,假设指定 -d c:\myclasses ⽽且该类名叫 package.MyClass,那么类⽂件就叫
作 c:\myclasses\com\mypackage\MyClass.class。
若未指定 -d 选项,则 javac 将把类⽂件放到与源⽂件同样的⽂件夹中。
注意: -d 选项指定的⽂件夹不会被⾃⼰主动增加到⽤户类路径中。
-
deprecation
显⽰每种不⿎舞使⽤的成员或类的使⽤或覆盖的说明。沒有给出 -deprecation 选项的话, javac 将显⽰这类源⽂件的名
称:这些源⽂件使⽤或覆盖不⿎舞使⽤的成员或类。
-encoding
设置源⽂件编码名称,⽐如 EUCJIS/SJIS。若未指定 -encoding 选项,则使⽤平台缺省的转换器。
-g
⽣成全部的调试信息,包含局部变量。缺省情况下,仅仅⽣成⾏号和源⽂件信息。
-g:none
不⽣成不论什么调试信息。
-g:{keyword列表}
仅仅⽣成某些类型的调试信息,这些类型由逗号分隔的keyword列表所指定。有效的keyword有:
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 版本号的虚拟机都兼容的类⽂件。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 中。缺省情况下,编译器信息送到 中。
-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
jdk怎么使用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 版的虚拟机上执⾏的代码。
C:> javac -target 1.1 -bootclasspath jdk1.1.7\lib\classes.zip \
-extdirs "" OldCode.java
-target 1.1
JDK 1.2 javac 在缺省状态下也将依据 1.2 版的⾃举类来进⾏编译,因此我们须要告诉 javac 让它依据 JDK 1.1 ⾃举类来进⾏编译。可⽤ -bootclasspath 和 -extdirs 选项来达到此⽬的。不这样做的话,可能会使编译器依据 1.2 版的 API 来进⾏编译。因为
1.1 版的虚拟机上可能沒有该 1.2 版的 API,因此执⾏时将出错。
选项可确保⽣成的类⽂件与 1.1 版的虚拟机兼容。在 JDK1.2 中,缺省情况下 javac 编译⽣成的⽂件是与 1.1 版的虚拟机兼容的,因此并⾮严格地须要该选项。然⽽,因为别的编译器可能採⽤其他的缺省设置,所以提供这⼀选项将不失为是个好习惯。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。