11、常用命令

javac

javac 是java中的编译源代码的命令工具,将.java文件编译成.class文件

javac <options> <source files>

options

常用语法

# 直接编译源文件,并将编译后的.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

编译Demo

单目录

目录结构

image-20230522145650957

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}

多目录编译

目录结构

image-20230522150547003

方式一:分目录编译
# 以下命令在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/

有依赖项目编译

目录结构

image-20230522152350765

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文件

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命令

打包

普通项目

目录结构

image-20230522163427776

编译项目

# jardemo目录下执行
javac src/top/ygang/jar/Start.java -d target/ -encoding utf-8 -sourcepath src/

进入target目录,创建清单文件MANIFEST.MF(如果只是工具类jar包,不单独启动执行,可跳过该步骤,会自动创建默认的清单文件)

MANIFEST.MF
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

有依赖的项目

目录结构

image-20230522165619299

编译项目

# 在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中目录结构

image-20230522170219526

解压

# 会解压jar到当前目录
jar -xvf jardemo.jar

更新

可以替换、新增jar中的文件

例如,在lib目录下面新增一个1.txt

jar -uf jardemo.jar lib/1.txt

java

java命令用于启动Java虚拟机并执行Java程序。使用java命令可以在命令行中直接运行编译后的Java程序。

java [options] class [args...]
# options:Java命令提供了多个选项来控制Java虚拟机和应用程序的行为。
# class:要运行的Java启动类名(含main方法)
# args…:传递给主方法的参数。这些参数将作为字符串数组传递给main()方法

Option