Java命令系列-javac

吐槽、建议、解惑入口网址

javac 命令详解

javac (java compiler)(java源码编译器),将源码代码(.java)编译成字节码文件(.class)。

备注:
在MyClass中的MyInerClass内部类,编译后生成MyClass$MyInnerClass.class

javac 命令使用

javac [命令参数] [单个源码文件] [多个源码文件(空格分隔,eg: MyClassA.java MyClassB.java)] [多个源码文件路径组成的文件(eg: @recordSourceFile)]

javac命令执行会自动识别当前路径。

使用javac样例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 编译一个类
useheart@useheart JavaCompiler % javac src/main/java/multi/TestMainOne.java
// 编译多个类
useheart@useheart JavaCompiler % javac src/main/java/multi/TestMainOne.java src/main/java/multi/TestMainTwo.java src/main/java/multi/TestMainThree.java
// 显示编译后class,自动放入在被编译文件路径下
useheart@useheart JavaCompiler % cd src/main/java/multi
useheart@useheart multi % ll
total 48
-rw-r--r-- 1 useheart staff 430 5 17 18:18 TestMainOne.class
-rw-r--r-- 1 useheart staff 203 5 17 18:02 TestMainOne.java
-rw-r--r-- 1 useheart staff 436 5 17 18:18 TestMainThree.class
-rw-r--r-- 1 useheart staff 207 5 17 18:02 TestMainThree.java
-rw-r--r-- 1 useheart staff 430 5 17 18:18 TestMainTwo.class
-rw-r--r-- 1 useheart staff 203 5 17 18:02 TestMainTwo.java
useheart@useheart multi %
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 显示Java路径文件
useheart@useheart compile % cat javaPaths
../src/main/java/multi/TestMainOne.java
../src/main/java/multi/TestMainTwo.java
../src/main/java/multi/TestMainThree.java
// 编译文件里面的java类
useheart@useheart compile % javac @javaPaths
// 显示编译后的class文件
useheart@useheart compile % cd ../src/main/java/multi
useheart@useheart multi % ll
total 48
-rw-r--r-- 1 useheart staff 430 5 17 18:29 TestMainOne.class
-rw-r--r-- 1 useheart staff 203 5 17 18:02 TestMainOne.java
-rw-r--r-- 1 useheart staff 436 5 17 18:29 TestMainThree.class
-rw-r--r-- 1 useheart staff 207 5 17 18:02 TestMainThree.java
-rw-r--r-- 1 useheart staff 430 5 17 18:29 TestMainTwo.class
-rw-r--r-- 1 useheart staff 203 5 17 18:02 TestMainTwo.java
javac 常用的命令参数

使用案例:

1
2
3
4
5
6
7
8
// 参数 -d
useheart@useheart JavaCompiler % javac -d compile/classes src/main/java/multi/*.java

useheart@useheart JavaCompiler % ll compile/classes/multi
total 24
-rw-r--r-- 1 useheart staff 430 5 17 19:02 TestMainOne.class
-rw-r--r-- 1 useheart staff 436 5 17 19:02 TestMainThree.class
-rw-r--r-- 1 useheart staff 430 5 17 19:02 TestMainTwo.class
sourcepath 和 classpath 的使用
1
2
3
4
5
6
7
8
//JarCompileBootstrap编译时需要使用其他文件Java类文件compile.ExternalUseClass和第三方class文件jar(commons-lang3-3.9.jar)
useheart@useheart JarCompiler % javac -sourcepath ./src/main/java -classpath /Users/useheart/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar src/main/java/JarCompileBootstrap.java

useheart@useheart JarCompiler % ll src/main/java
total 16
-rw-r--r-- 1 useheart staff 677 5 17 19:25 JarCompileBootstrap.class
-rw-r--r-- 1 useheart staff 502 5 17 17:51 JarCompileBootstrap.java
drwxr-xr-x 4 useheart staff 128 5 17 19:25 compile
源码发行版 和 虚拟机使用目标发行版
1
2
useheart@useheart JavaCompiler % javac -d compile/classes -target 1.8 -source 1.8 -encoding utf-8 -version  src/main/java/multi/*.java
javac 1.8.0_211
-parameters
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
useheart@useheart JarCompiler % javac -parameters  -sourcepath ./src/main/java  -classpath /Users/useheart/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar  src/main/java/JarCompileBootstrap.java

// 反编译结果
import compile.ExternalUseClass;
import org.apache.commons.lang3.StringUtils;

public class JarCompileBootstrap {
public JarCompileBootstrap() {
}

//-parameters 使用参数名args保持原样,没有是-parameters,参数名会是var0.
public static void main(String[] args) {
System.out.println(StringUtils.trim("引入commons-lang3 编译使用"));
ExternalUseClass var1 = new ExternalUseClass();
var1.external();
System.out.println("Bootstrap 启动");
}
}
-verbose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
useheart@useheart JavaCompiler % javac -verbose  src/main/java/multi/TestMainOne.java
[解析开始时间 RegularFileObject[src/main/java/multi/TestMainOne.java]]
[解析已完成, 用时 14 毫秒]
[源文件的搜索路径: /opt/apache-jmeter-5.2.1/lib/ext/ApacheJMeter_core.jar,/opt/apache-jmeter-5.2.1/lib/jorphan.jar,/opt/apache-jmeter-5.2.1/lib/logkit-2.0.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar,.]
[类文件的搜索路径: /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/resources.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/rt.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/sunrsasign.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jsse.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jce.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/charsets.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/jfr.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/classes,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunec.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/nashorn.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/cldrdata.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/jfxrt.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/dnsns.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/localedata.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/jaccess.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/ext/zipfs.jar,/System/Library/Java/Extensions/MRJToolkit.jar,/opt/apache-jmeter-5.2.1/lib/ext/ApacheJMeter_core.jar,/opt/apache-jmeter-5.2.1/lib/jorphan.jar,/opt/apache-jmeter-5.2.1/lib/logkit-2.0.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar,/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar,.]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[正在检查multi.TestMainOne]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Byte.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Character.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Short.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Long.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Float.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Integer.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Double.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Boolean.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Void.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Appendable.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/io/Closeable.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/io/Flushable.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]
[正在加载ZipFileIndexFileObject[/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/ct.sym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]]
[已写入RegularFileObject[src/main/java/multi/TestMainOne.class]]
[共 161 毫秒]
useheart@useheart JavaCompiler %

javac help 文档输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
useheart@useheart multi % javac -help
用法: javac <options> <source files>
-g 生成所有调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-parameters 生成元数据以用于方法参数的反射
-d <目录> 指定放置生成的类文件的位置
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-version 版本信息
-help 输出标准选项的提要
@<文件名> 从文件读取选项和文件名

执行(man javac)文档

javac英文文档

不曾拥有,所以努力。(坚持原创技术分享,您的支持将鼓励我继续创作!)