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 包的源码,源码如下:
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