javac命令使用方法
javac [ options ] [ sourcefiles ] [ @files ] (參数可按随意次序排列)
options:命令行选项
sourcefiles:一个或多个要编译的源文件(比如 MyClass.java)
@files:一个或多个对源文件进行列表的文件
javac命令说明:
有两种方法可将源码文件名称传递给 javac:
第一种:假设源文件数量少,在命令行上列出文件名称就可以,如javac XXX1.java XXX2.java
第二种:假设源文件数量多,则将源文件名称列在一个文件里,名称间用空格或回车行来进行分隔。然后在 javac 命令行中使用该列表文件名称,文件名称前冠以 @ 字符。
源码文件名称称必须含有 .java 后缀,类文件名称称必须含有 .class 后缀,源文件和类文件都必须有识别该类的根名。比如,名为 MyClass 的类将写在名为MyClass.java的源文件里,并被编译为字节码类文件 MyClass.class。内部类定义产生附加的类文件。这些类文件的名称将内部类和外部类的名称结合在一起,比如 MyClass$MyInnerClass.class。应当将源文件安排在反映其包树结构的文件夹树中。比如,假设将全部的源文件放在 /workspace 中,那么 com.mysoft.mypack.MyClass 的代码应该在 \workspace\com\mysoft\mypack\MyClass.java 中。缺省情况下,编译器将每一个类文件与其源文件放在同一文件夹中。可用 -d 选项(请參阅后面的选项)指定其他目标文件夹。
查找类型:当编译源文件时,编译器常常须要它还沒有识别出的类型的有关信息。对于源文件里使用、扩展或实现的每一个类或接口,编译器都须要其类型信息。这包含在源文件里沒有明白提及、但通过继承提供信息的类和接口。比如,当扩展 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 能够隐式编译一些沒有在命令行中提及的源文件。用 -verbose 选项可跟踪自己主动编译。
标准选项:
-classpath 类路径
设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前文件夹构成。有关具体信息,请參阅设置类路径。
若未指定 -sourcepath 选项,则将在用户类路径中查找类文件和源文件。
-d 文件夹
设置类文件的目标文件夹。假设某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子文件夹中,必要时创建文件夹。比如,假设指定 -d c:\myclasses 而且该类名叫 com.mypackage.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 中。缺省情况下,编译器信息送到 System.err 中。
-Xverbosepath
说明怎样搜索路径和标准扩展以查找源文件和类文件。
-J选项
将选项传给 javac 调用的 java 启动器。比如, -J-Xms48m 将启动内存设为 48 兆字节。尽管它不以 -X 开头,但它并非 javac 的‘标准选项’。用 -J将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。
注意: CLASSPATH 、 -classpath 、 -bootclasspath 和 -extdirs 并 不 指定用于执行 javac 的类。如此滥用编译器的实现通常沒有不论什么意义而且总是非常危急的。假设确实须要这样做,可用 -J 选项将选项传给主要的 java 启动器。
程序示例:
程序示例1:编译带包的源文件
我们使用D:/JavaTest作为顶层目录,按照包名创建文件夹及源文件如下:
package com.xuetang9.commanddemo;
public class HelloJavaC{
public static void main(String[] args){
System.out.println("javac命令示例");
}
}
在顶层目录JavaTest中键入命令:
# 注意:如果执行时出现乱码,可以使用下面的命令重新编译:
javac -encoding utf8 com\xuetang9\commanddemo\HelloJavaC.java
使用dir命令,可以看到com/xuetang9/commanddemo下已经有了编译后的字节码文件:
执行下面的命令即的到运行结果:
java com.xuetang9.commanddemo.HelloJavaC
程序示例2:将源文件和.class文件分开(模仿eclipse目录结构)
目录结构重新设置如下:
下面是两个Java源文件的代码,请大家根据包名自行创建在各自的src文件夹下:
package com.xuetang9.util;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil{
public void show(){
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
System.out.println(format.format(new Date()));
}
}
package com.xuetang9.commanddemo;
import com.xuetang9.util;
public class HelloJavaC{
public static void main(String[] args){
//调用另一个包中类的方法
DateUtil dateUtil = new DateUtil();
dateUtil.show();
}
}
下面开始编译过程:
2-1:进入工程目录JavaTest,首先编译被调用的类:
javac -d bin "src\com\xuetang9\util\DateUtil.java"
# -d destdir 用来指定存放编译生成的.class文件路径,如果省略就默认在当前目录生成.class文件,并且不生成包文件夹
2-2:配置classpath环境变量,让JVM能够找到DateUtil.class文件
set classpath=d:\JavaTest\bin
所设置的环境变量可以通过下面的Java程序查看:
package com.xuetang9.commanddemo;
public class PrintDemo{
public static void main(String[] args){
System.out.println(System.getProperty("java.class.path")); //系统的classpaht路径
System.out.println(System.getProperty("user.dir")); //用户的当前路径
}
}
编译及执行:
编译执行HelloJavaC:
更多干货笔记关注微信公众号 : 老九学堂