javac
是java中的编译源代码的命令工具,将.java
文件编译成.class
文件
javac <options> <source files>
-sourcepath
:指定你依赖的类的.java
文件的查找位置,如果找到会自动编译-classpath
(-cp
):指定你依赖的类的.class
文件的查找位置,在Linux中,用“:
”分隔classpath
,而在windows中,用“;
”分隔。# 直接编译源文件,并将编译后的.class文件放到与源文件统一目录下,如果编译多个源文件,可以使用javac *.java
javac xxx.java
# 编译源文件,并将编译后的.class文件放到-d参数后的目标路径target\目录中,目录需要自己手动创建
javac xxx.java -d target\
# 如果遇到类似于,错误: 编码GBK的不可映射字符,需要指定字符集编码
javac xxx.java -d target\ -encoding utf-8
# 对于大型项目有很多源码文件,可以使用sourcesfiles.txt指定,文件中使用回车符分割源文件
javac @sourcesfiles.txt -d target\ -encoding utf-8
目录结构
Start.java
package top.ygang.javac;
public class Start {
public static void main(String[] args) {
Student lucy = new Student("lucy", 18);
System.out.println(lucy);
}
}
Student.java
package top.ygang.javac;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
# 在javacdemo目录下执行命令,创建target目录
mkdir target
# 在javacdemo目录下执行命令,编译
javac src/top/ygang/javac/*.java -d target/ -encoding utf-8
# 进入target目录
cd target
# 运行java程序
java top.ygang.javac.Start
# Student{name='lucy', age=18}
目录结构
# 以下命令在javacdemo目录下执行
# 编译entity目录
javac src/top/ygang/javac/entity/*.java -d target/ -encoding utf-8
# 编译javac目录
# 由于Start.java中引用了Student,所以需要指定-cp,用于编译器寻找Studnet.class
javac src/top/ygang/javac/*.java -d target/ -encoding utf-8 -cp target/
javacdemo目录下创建sourcefiles.txt
文件,并写入所有类路径
src/top/ygang/javac/entity/Student.java
src/top/ygang/javac/Start.java
编译
# 在javacdemo目录下执行命令
javac @sourcefiles.txt -d target/ -encoding utf-8
由于程序的入口类是main方法所在类,整个依赖类的引用链也是从main方法类开始的,所以,我们可以利用-sourcepath
,来指定源文件根路径,让编译器自己去寻找其他源文件并编译
# 在javacdemo目录下执行
javac src/top/ygang/javac/Start.java -d target/ -encoding utf-8 -sourcepath src/
目录结构
Start.java
package top.ygang.javac;
import com.alibaba.fastjson.JSON;
import top.ygang.javac.entity.Student;
public class Start {
public static void main(String[] args) {
Student lucy = new Student("lucy", 18);
String jsonString = JSON.toJSONString(lucy);
System.out.println(jsonString);
}
}
由于此时项目依赖了第三方jar,所以需要使用-cp
给编译器指出jar路径
# 在javacdemo目录下执行
javac src/top/ygang/javac/Start.java -d target/ -encoding utf-8 -sourcepath src/ -cp lib/fastjson-1.2.34.jar
运行,上面的编译命令只是可以让程序通过编译检查,并不会复制依赖jar,所以需要我们手动把lib
目录复制到target
目录下后运行
运行程序时,同样需要指定-cp
,需要显式的指定当前目录./
也是classpath
# 在target目录下执行
java -cp ./;lib/fastjson-1.2.34.jar top.ygang.javac.Start
jar
命令用于操作.jar
文件
jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名
# 其中{ctxu}这四个选项必须选其一。[v f m e 0 M i ]是可选选项,文件名也是必须的。
-c 创建一个jar包
-t 显示jar中的内容列表
-x 解压jar包
-u 添加文件到jar包中
-f 指定jar包的文件名
-v 生成详细的报造,并输出至标准设备
-m 指定manifest.mf文件.(manifest.mf文件中可以对jar包及其中的内容作一些一设置)
-0 产生jar包时不对其中的内容进行压缩处理
-M 不产生所有文件的清单文件(Manifest.mf)。这个参数与忽略掉-m参数的设置
-i 为指定的jar文件创建索引文件
-C 表示转到相应的目录下执行jar命令,相当于cd到那个目录,然后不带-C执行jar命令
目录结构
编译项目
# jardemo目录下执行
javac src/top/ygang/jar/Start.java -d target/ -encoding utf-8 -sourcepath src/
进入target
目录,创建清单文件MANIFEST.MF
(如果只是工具类jar包,不单独启动执行,可跳过该步骤,会自动创建默认的清单文件)
:
后面都要有一个空格Manifest-Version
:用来定义manifest文件的版本,例如:Manifest-Version: 1.0(固定存在)Created-By
:声明该文件的生成者,一般该属性是由jar命令行工具生成的(固定存在)Main-Class
:定义jar文件的入口类,该类必须是一个可执行的类(包含main方法的类),一旦定义了该属性即可通过 java -jar x.jar
来运行该jar文件。Class-Path
:应用程序或者类装载器使用该值来构建内部的类搜索路径,可指定多个路径Manifest-Version: 1.0
Created-By: 1.8.0_261 (Oracle Corporation)
Main-Class: top.ygang.jar.Start
打包
# 进入target目录执行
jar -cvfm jardemo.jar MANIFEST.MF top/
执行
java -jar jardemo.jar
目录结构
编译项目
# 在jardemo目录下执行
javac src/top/ygang/jar/Start.java -sourcepath src/ -cp lib/fastjson-1.2.34.jar -encoding utf-8 -d target
编写MANIFEST.MF
文件
Manifest-Version: 1.0
Created-By: 1.8.0_261 (Oracle Corporation)
Main-Class: top.ygang.jar.Start
Class-Path: lib/fastjson-1.2.34.jar
将lib目录复制到target目录下
# 在target目录下执行
jar -cvfm jardemo.jar MANIFEST.MF top/ lib/
打包后,jardemo.jar
中目录结构
# 会解压jar到当前目录
jar -xvf jardemo.jar
可以替换、新增jar中的文件
例如,在lib
目录下面新增一个1.txt
jar -uf jardemo.jar lib/1.txt
java
命令用于启动Java虚拟机并执行Java程序。使用java命令可以在命令行中直接运行编译后的Java程序。
java [options] class [args...]
# options:Java命令提供了多个选项来控制Java虚拟机和应用程序的行为。
# class:要运行的Java启动类名(含main方法)
# args…:传递给主方法的参数。这些参数将作为字符串数组传递给main()方法
-version
:查看Java版本信息。-jar file
:执行指定的JAR文件。-classpath path
:指定Java虚拟机应该搜索类文件的路径。与javac
编译器选项-cp相同。-Xmx size
:指定堆大小的最大值,以字节为单位。例如,-Xmx1024m
表示堆大小的最大值为1024 MB
。-Xms size
:指定初始堆大小,以字节为单位。-Dproperty=value
,通过System.getProperty()
方法可以获取
-Djava.awt.headless=true
:表示启用无头模式。-Dfile.encoding=utf-8
:设置系统字符集编码