Java可执行命令详解之javac
- 1️⃣ 概念
- 2️⃣ 优势和缺点
- 3️⃣ 使用
- 3.1 语法格式
- 3.1.1 可选参数:-d
- 3.1.2 可选参数:-classpath
- 3.1.3 可选参数:-sourcepath
- 3.1.4 可选参数:-target
- 3.1.5 可选参数:-g
- 4️⃣ 应用场景
- 5️⃣ 注意事项
- 🌾 总结
1️⃣ 概念
Java 编程语言的可执行命令程序 javac
是 Java Development Kit (JDK) 的一部分,旨在将 Java 源代码编译为可执行的字节码文件。javac
的设计目的是为了支持 Java 的跨平台特性,使开发人员能够编写一次代码,然后在不同的操作系统上运行。
javac
是 Java 编译器的命令行前端,它将 Java 源代码作为输入,并将其转换为可由 Java 虚拟机(JVM)执行的字节码文件。它采用的是即时编译(Just-In-Time Compilation,JIT
)的方式,将高级 Java 代码转换为底层机器代码。
🔍 关于Java如何实现可移植性的基本原理,请查阅我的另一篇文章:
【Java面试题】第一期:Java基础篇,每周10道,根本停不下来~
🔍 关于什么是字节码及好处是什么,请查阅我的另一篇文章:
【Java面试题】第八期:Java进阶篇,每周10道,根本停不下来~
javac
的作用是将 Java 源代码文件编译为能够在 Java 虚拟机上执行的字节码文件(以.class
为扩展名)。它起到连接源代码和虚拟机之间的桥梁,将源代码转换为可执行的中间形式。
javac
在编译过程中使用了多阶段的方法。它首先将源代码解析为抽象语法树(AST),然后对 AST 进行类型检查和语义分析,最后生成中间表示形式也即字节码文件。
2️⃣ 优势和缺点
优点:
- 跨平台性:
javac
生成的字节码文件可以在任何具有兼容的 Java 虚拟机的操作系统上运行; - 高度可移植性:通过使用 Java 编译器,Java 开发者可以创建独立于操作系统的应用程序;
- 自动内存管理:Java 编译器为开发者提供了自动内存管理机制(垃圾回收),减少了手动内存管理的需求。
缺点:
- 开发过程中可能出现较长的编译时间,特别是对于大型项目。
3️⃣ 使用
3.1 语法格式
javac
命令的使用语法格式如下:
javac [options] <sourcefiles>
各项的含义如下:
javac
: 表示要运行的Java编译器命令;[options]
: 表示可选的参数选项。可以在这里指定不同的编译选项来控制编译过程的行为;<sourcefiles>
: 表示要编译的源代码文件的名称或路径。这些源代码文件应该是以.java
为扩展名的Java源代码文件。
通过使用不同的编译选项,可以自定义编译过程的行为,例如指定输出目录、调整编译级别、启用特定的警告等。同时,可以传入一个或多个源代码文件,javac
将会对这些文件进行编译转换为字节码文件(以.class
为扩展名)。
注意,其中的方括号[]
表示选项为可选的,而尖括号<>
表示需要用户根据实际情况提供相应的参数值。
javac
命令支持许多可选参数来控制编译过程和生成的字节码文件。汇总全部的可选参数如下表:
参数 | 说明 |
---|---|
-g | 生成所有调试信息 |
-g:none | 不生成任何调试信息 |
-g:{lines,vars,source} | 只生成某些调试信息 |
-nowarn | 不生成任何警告 |
-verbose | 输出有关编译器正在执行的操作的消息 |
-deprecation | 输出使用已过时的 API 的源位置 |
-classpath <路径> | 指定查找用户类文件和注释处理程序的位置 |
-cp <路径> | 指定查找用户类文件和注释处理程序的位置 |
-sourcepath <路径> | 指定查找输入源文件的位置 |
-bootclasspath <路径> | 覆盖引导类文件的位置 |
-extdirs <目录> | 覆盖所安装扩展的位置 |
-endorseddirs <目录> | 覆盖签名的标准路径的位置 |
-proc:{none,only} | 控制是否执行注释处理和/或编译。 |
-processor [,,…] | 要运行的注释处理程序的名称; 绕过默认的搜索进程 |
-processorpath <路径> | 指定查找注释处理程序的位置 |
-parameters | 生成元数据以用于方法参数的反射 |
-d <目录> | 指定放置生成的类文件的位置 |
-s <目录> | 指定放置生成的源文件的位置 |
-h <目录> | 指定放置生成的本机标头文件的位置 |
-implicit:{none,class} | 指定是否为隐式引用文件生成类文件 |
-encoding <编码> | 指定源文件使用的字符编码 |
-source <发行版> | 提供与指定发行版的源兼容性 |
-target <发行版> | 生成特定 VM 版本的类文件 |
-profile <配置文件> | 请确保使用的 API 在指定的配置文件中可用 |
-version | 版本信息 |
-help | 输出标准选项的提要 |
-A关键字[=值] | 传递给注释处理程序的选项 |
-X | 输出非标准选项的提要 |
-J<标记> | 直接将 <标记> 传递给运行时系统 |
-Werror | 出现警告时终止编译 |
@<文件名> | 从文件读取选项和文件名 |
可以看到命令所有的可选参数很多,读者可以根据上边表格选择所需参数来执行命令。下面主要介绍几个常用的参数:
-d <directory>
: 指定编译后的字节码文件输出目录;-classpath <path>
: 指定编译时查找类、接口和包的路径;-sourcepath <path>
: 指定查找源文件的路径;-target <version>
: 指定生成的字节码文件的目标 Java 版本;-g
: 生成用于调试的附加信息。
3.1.1 可选参数:-d
使用 -d
指定编译后字节码文件的输出目录。
运行以下命令,使用 -d
参数 指定了编译src\com\xiaoshan\MyClass.java
类之后的文件输出目录为target
:
javac -d target src\com\xiaoshan\MyClass.java
查看编译结果,可以看到已经正确在我指定的目录下生成了MyClass.class
文件:
3.1.2 可选参数:-classpath
-classpath <path>
参数用于指定编译时查找类、接口和包文件的路径。下面是使用命令的一个示例:
假设 MyClass.java
依赖于另一个名为 MyLibrary.jar
的外部库。而这个外部库文件 MyLibrary.jar
存储在 /path/to/lib
目录下。现在需要在编译源代码时,让 javac
命令能够正确找到并引用外部库。
使用 -classpath
选项来指定外部库的路径:
javac -classpath /path/to/lib/MyLibrary.jar MyClass.java
这将告诉 javac
命令在编译 MyClass.java
文件时,在 /path/to/lib
目录下查找额外的类文件。
通过使用 -classpath
选项,可以指定编译时所需的外部库或其他类文件的路径,使得 javac
命令在进行编译时能够正确找到并引用这些类文件,使用时根据实际情况将 <path>
替换为外部库或类文件的路径。
3.1.3 可选参数:-sourcepath
-sourcepath <path>
参数用于指定查找源文件的路径。下面是使用 javac -sourcepath <path>
命令的一个示例:
假设有一个名为 src
的目录,该目录包含了 Java 源代码文件。希望在编译源代码时,让 javac
命令能够正确找到并编译这些源文件。可以使用 -sourcepath
选项来指定源文件的路径:
javac -sourcepath src MyClass.java
这将告诉 javac
命令在编译过程中,在 src
目录下查找所需的源代码文件。
通过使用 -sourcepath
选项,可以指定用于查找源文件的路径,使得 javac
命令能够在进行编译时正确地找到和编译源代码文件。请根据实际情况将 <path>
替换为源代码文件的路径。
注意,<path>
可以是单个路径,也可以是多个路径,多个路径之间使用路径分隔符(:
在 Unix/Linux,;
在 Windows)分隔。
3.1.4 可选参数:-target
-target <version>
参数用于指定生成的Java字节码文件的目标版本。下面是使用 javac -target <version>
命令的一个示例:
希望将 MyClass.java
的源代码文件编译后的字节码文件的目标版本设置为 Java 8。则可以使用 -target
选项来指定目标版本:
javac -target 1.8 MyClass.java
这将告诉 javac
命令生成兼容 Java 8 的字节码文件。
通过使用 -target
选项,可以指定生成的字节码文件的目标版本,以确保与特定版本的Java运行时环境兼容。根据需要将 <version>
替换为所需的Java版本号。需要注意,只有支持该版本的 JDK 才能提供适当的目标编译器。
3.1.5 可选参数:-g
我们可以使用-g
选项来生成包含调试信息的字节码文件,以便在调试程序时进行更详细的跟踪和分析。
以下是一个示例:
希望在编译 MyClass.java
文件时生成包含调试信息的字节码文件,使用 -g
选项来生成包含调试信息的字节码文件:
javac -g MyClass.java
通过使用 -g
选项,可以让 javac
命令在编译过程中生成带有调试信息的字节码文件。这将有助于在调试程序时进行变量跟踪、堆栈跟踪等操作。
4️⃣ 应用场景
javac
主要用于编译 Java 源代码文件,并生成可供 Java 虚拟机执行的字节码文件。
开发人员可以使用 javac
将 Java 代码转换成与特定硬件平台无关的中间表示,以便在不同的操作系统上运行。
5️⃣ 注意事项
- 在使用
javac
前,需要首先安装正确版本的 JDK,并配置好相应的环境变量; - 确保 Java 源代码文件的扩展名为
.java
; - 处理源代码时,确保源文件之间的依赖关系得到正确管理,以避免编译错误。
🌾 总结
javac
是 Java 编译器的命令行前端工具,用于将 Java 源代码文件编译成可在 Java 虚拟机上执行的字节码文件。它具有跨平台性、可移植性以及自动内存管理等优点,同时也存在较长的编译时间和性能损耗的缺点。
开发人员可以通过适当使用参数来控制编译过程和生成的字节码文件。javac
在编译过程中使用多阶段方法,从解析源代码到生成字节码文件。它在开发 Java 应用程序和跨平台开发方面有广泛应用,并且是 Java 开发人员的常用工具之一。