练习题知识点系列之详解Javac命令

javac命令使用方法

javac [ options ] [ sourcefiles ] [ @files ]  (參数可按随意次序排列)

    options:命令行选项

    sourcefiles:一个或多个要编译的源文件(比如 MyClass.java)

    @files:一个或多个对源文件进行列表的文件

javac命令说明:

有两种方法可将源码文件名称传递给 javac:

第一种:假设源文件数量少,在命令行上列出文件名称就可以,如javac XXX1.java XXX2.java

 练习题知识点系列之详解Javac命令

第二种:假设源文件数量多,则将源文件名称列在一个文件里,名称间用空格或回车行来进行分隔。然后在 javac 命令行中使用该列表文件名称,文件名称前冠以 @ 字符。

 练习题知识点系列之详解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作为顶层目录,按照包名创建文件夹及源文件如下:

练习题知识点系列之详解Javac命令

 

 

package com.xuetang9.commanddemo;

 

public class HelloJavaC{

    public static void main(String[] args){

        System.out.println("javac命令示例");

    }

}

在顶层目录JavaTest中键入命令:

练习题知识点系列之详解Javac命令

 

 

# 注意:如果执行时出现乱码,可以使用下面的命令重新编译:

javac -encoding utf8 com\xuetang9\commanddemo\HelloJavaC.java

使用dir命令,可以看到com/xuetang9/commanddemo下已经有了编译后的字节码文件:

 练习题知识点系列之详解Javac命令

 

 

执行下面的命令即的到运行结果:

java com.xuetang9.commanddemo.HelloJavaC

 练习题知识点系列之详解Javac命令

 

 

程序示例2:将源文件和.class文件分开(模仿eclipse目录结构)

目录结构重新设置如下:

练习题知识点系列之详解Javac命令

 

 


下面是两个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"));         //用户的当前路径

    }

}

编译及执行:

练习题知识点系列之详解Javac命令

编译执行HelloJavaC:

练习题知识点系列之详解Javac命令

更多干货笔记关注微信公众号 : 老九学堂

上一篇:环境变量的配置过程


下一篇:Javac 1.7版无法为目标1.7构建