javac.exe 编译器

javac 是 java 语言的编译器,全称 java compiler。

javac 工具读取由 java 语言编写的类和接口的源文件,并将它们编译成字节码 class 文件。

javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译。当编译源文件时,编译器常常需要它还没有识别出的类型的有关信息。

对于源文件中使用、扩展或实现的每个类或接口,编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。

命令格式

javac <options> <source files>

命令选项

  • -g  生成所有调试信息

  • -g:none  不生成任何调试信息

  • -g:{lines,vars,source}  只生成某些调试信息

  • -nowarn  不生成任何警告

  • -verbose  输出有关编译器正在执行的操作的消息

  • -deprecation  输出使用已过时的 API 的源位置

  • -classpath <路径>  指定查找用户类文件和注释处理程序的位置

  • -cp <路径>  指定查找用户类文件和注释处理程序的位置

  • -sourcepath <路径>  指定查找输入源文件的位置

  • -bootclasspath <路径>  覆盖引导类文件的位置

  • -extdirs <目录>  覆盖所安装扩展的位置

  • -endorseddirs <目录>  覆盖签名的标准路径的位置

  • -proc:{none,only}  控制是否执行注释处理和/或编译。

  • -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程

  • -processorpath <路径>  指定查找注释处理程序的位置

  • -parameters  生成元数据以用于方法参数的反射

  • -d <目录>  指定放置生成的类文件的位置

  • -s <目录>  指定放置生成的源文件的位置

  • -h <目录>  指定放置生成的本机标头文件的位置

  • -implicit:{none,class}  指定是否为隐式引用文件生成类文件

  • -encoding <编码>  指定源文件使用的字符编码

  • -source <发行版>  提供与指定发行版的源兼容性

  • -target <发行版>  生成特定 VM 版本的类文件

  • -profile <配置文件>  请确保使用的 API 在指定的配置文件中可用

  • -version  版本信息

  • -help  输出标准选项的提要

  • -A关键字[=值]  传递给注释处理程序的选项

  • -X  输出非标准选项的提要

  • -J<标记>  直接将 <标记> 传递给运行时系统

  • -Werror  出现警告时终止编译

  • @<文件名>  从文件读取选项和文件名

命令示例

编译无包简单类

下面将使用 javac.exe 编译一个简单的类,该类没有包名称,源码如下:

public class Demo1 {

    public static void main(String[] args) {
        System.out.println("Demo1");
    }

}

编译步骤如下:

(1)查看源码位置,如下:

E:\java_tool\java> dir
 驱动器 D 中的卷是 数据盘
 卷的序列号是 10E3-09C5

 E:\java_tool\java 的目录

2024/01/21  10:36    <DIR>          .
2024/01/21  10:39    <DIR>          ..
2024/01/21  08:41    <DIR>          com
2024/01/21  10:36               401 Demo1.class
2024/01/21  08:41               122 Demo1.java
               2 个文件            523 字节
               3 个目录 243,467,329,536 可用字节

(2)将编译后的字节码文件放在当前目录,如下:

E:\java_tool\java> javac Demo1.java

E:\java_tool\java> java Demo1
Demo1

(3)通过 -d 选项将编译后的字节码文件放到上级目录,如下:

E:\java_tool\java> javac -d .. Demo1.java

E:\java_tool\java> java -cp .. Demo1
Demo1

编译有包简单类

下面将使用 javac.exe 编译一个带有 com.hxstrive.demo2 包的简单类,代码如下:

package com.hxstrive.demo2;

public class Demo2 {

    public static void main(String[] args) {
        System.out.println("Demo2");
    }

}

编译步骤如下:

(1)查看源码位置,如下:

E:\java_tool\java\com\hxstrive\demo2>dir
 驱动器 E 中的卷是 TMP
 卷的序列号是 1279-ACC7

 E:\java_tool\java\com\hxstrive\demo2 的目录

2024/01/21  21:49    <DIR>          .
2024/01/21  11:05    <DIR>          ..
2024/01/21  11:05               151 Demo2.java
               1 个文件            151 字节
               2 个目录 19,958,579,200 可用字节

(2)使用 javac.exe 编译源码,如下:

E:\java_tool\java\com\hxstrive\demo2> javac -d . Demo2.java

(3)查看编译后的字节码位置,如下:

E:\java_tool\java\com\hxstrive\demo2> tree /F /A .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO2
|   Demo2.java
|
\---com
    \---hxstrive
        \---demo2
                Demo2.class

从上面输出可以得知,编译生成的 class 文件位于 com/hxstrive/demo2 目录下面。

(4)使用 java 命令运行 Demo2,如下:

E:\java_tool\java\com\hxstrive\demo2> java com.hxstrive.demo2.Demo2
Demo2

或者

E:\java_tool\java\com\hxstrive\demo2> java com/hxstrive/demo2/Demo2
Demo2

同一个包下,一个类调用另一个类

下面介绍在某个包下面存在多个类,一个类调用了另一个类,怎样使用 javac.exe 命令进行编译,源码如下:

Tom.java

package com.hxstrive.demo3;

public class Tom {

    public String getName() {
        return "Tom";
    }

}

Demo3.java

package com.hxstrive.demo3;

public class Demo3 {

    public static void main(String[] args) {
        Tom tom = new Tom();
        System.out.println("Demo3 -> " + tom.getName());
    }

}

编译步骤如下:

(1)查看源码位置,如下:

E:\java_tool\java\com\hxstrive\demo3>dir
 驱动器 E 中的卷是 TMP
 卷的序列号是 1279-ACC7

 E:\java_tool\java\com\hxstrive\demo3 的目录

2024/01/21  11:05    <DIR>          .
2024/01/21  11:05    <DIR>          ..
2024/01/21  11:05               201 Demo3.java
2024/01/21  21:58               119 Tom.java
               2 个文件            320 字节
               2 个目录 19,958,579,200 可用字节

(2)由于 Demo3.java 类调用了 Tom.java 类,因此首先要编译 Tom.java,如下:

E:\java_tool\java\com\hxstrive\demo3> javac -d . Tom.java

编译后,会按照包结构生成 com/hxstrive/demo3/Tom.class 文件,如下:

E:\java_tool\java\com\hxstrive\demo3> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO3
|   Demo3.java
|   Tom.java
|
\---com
    \---hxstrive
        \---demo3
                Tom.class

(3)接下来编译 Demo3.java 文件,javac 会到 -cp 指示的“.”当前目录下寻找 Tom 依赖,然后按照包结构生成 com/hxstrive/demo3/Demo3.class 文件,如下:

E:\java_tool\java\com\hxstrive\demo3> javac -d . Demo3.java

E:\java_tool\java\com\hxstrive\demo3> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO3
|   Demo3.java
|   Tom.java
|
\---com
    \---hxstrive
        \---demo3
                Demo3.class
                Tom.class

(4)使用 java 命令运行 Demo3 文件,如下:

E:\java_tool\java\com\hxstrive\demo3> java com.hxstrive.demo3.Demo3
Demo3 -> Tom

或者

E:\java_tool\java\com\hxstrive\demo3> java com/hxstrive/demo3/Demo3
Demo3 -> Tom

一个包下的类调用另一个包下的类

下面介绍一个包下面的类调用另一个包下面的类,怎样使用 javac 命令进行编译,源码如下:

Tom.java

package com.hxstrive.demo4.p1;

public class Tom {

    public String getName() {
        return "Tom";
    }

}

Demo4.java

package com.hxstrive.demo4.p2;

import com.hxstrive.demo4.p1.Tom; // 导入类引用

public class Demo4 {

    public static void main(String[] args) {
        Tom tom = new Tom();
        System.out.println("Demo4 -> " + tom.getName());
    }

}

编译步骤如下:

(1)查看源码位置,如下:

E:\java_tool\java\com\hxstrive\demo4> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO4
+---p1
|       Tom.java
|
\---p2
        Demo4.java

(2)由于 Demo4.java 通过 import 语句引用类 Tom.java,因此先使用 javac 编译 Tom.java 类,如下:

E:\java_tool\java\com\hxstrive\demo4> javac -d . p1/Tom.java

E:\java_tool\java\com\hxstrive\demo4> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 000001F1 1279:ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO4
+---com
|   \---hxstrive
|       \---demo4
|           \---p1
|                   Tom.class
|
+---p1
|       Tom.java
|
\---p2
        Demo4.java

(3)继续编译 Demo4.java,如下:

E:\java_tool\java\com\hxstrive\demo4> javac -d . p2/Demo4.java

E:\java_tool\java\com\hxstrive\demo4> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO4
+---com
|   \---hxstrive
|       \---demo4
|           +---p1
|           |       Tom.class
|           |
|           \---p2
|                   Demo4.class
|
+---p1
|       Tom.java
|
\---p2
        Demo4.java

(4)运行 Demo4 程序,如下:

E:\java_tool\java\com\hxstrive\demo4> java com.hxstrive.demo4.p2.Demo4
Demo4 -> Tom

或者

E:\java_tool\java\com\hxstrive\demo4> java -cp . com.hxstrive.demo4.p2.Demo4
Demo4 -> Tom

或者

E:\java_tool\java\com\hxstrive\demo4> java -cp . com/hxstrive/demo4/p2/Demo4
Demo4 -> Tom

带有外部jar包

下面将介绍怎样编译引用外部 jar 包的源码,源码如下:

package com.hxstrive.demo5;

import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;

public class Demo5 {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C");
        System.out.println("Demo5 -> " + StringUtils.join(list, ","));
    }

}

项目结构如下:

E:\java_tool\java\com\hxstrive\demo5> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO5
|   Demo5.java
|
\---libs
        commons-lang3-3.4.jar

编译步骤如下:

(1)编译 Demo5.java 源码,如下:

E:\java_tool\java\com\hxstrive\demo5> javac -cp ./libs/commons-lang3-3.4.jar -d . Demo5.java

E:\java_tool\java\com\hxstrive\demo5> tree /A /F .
卷 TMP 的文件夹 PATH 列表
卷序列号为 1279-ACC7
E:\JAVA_TOOL\JAVA\COM\HXSTRIVE\DEMO5
|   Demo5.java
|
+---com
|   \---hxstrive
|       \---demo5
|               Demo5.class
|
\---libs
        commons-lang3-3.4.jar

(2)运行 Demo5 程序,如下:

E:\java_tool\java\com\hxstrive\demo5> java -cp .;./libs/commons-lang3-3.4.jar com.hxstrive.demo5.Demo5
Demo5 -> A,B,C

或者

E:\java_tool\java\com\hxstrive\demo5> java -cp .;./libs/commons-lang3-3.4.jar com/hxstrive/demo5/Demo5
Demo5 -> A,B,C
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号