跳过正文
  1. 文章/
  2. Java/
  3. JavaSE/
  4. JavaSE高级/

11、常用命令

·2511 字·6 分钟· loading · loading · ·
Java JavaSE JavaSE高级
GradyYoung
作者
GradyYoung
JavaSE高级 - 点击查看当前系列文章
§ 11、常用命令 「 当前文章 」

javac
#

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

javac <options> <source files>

options
#

  • -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

编译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:用来定义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

有依赖的项目
#

目录结构

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
#

  • 标准选项
    • -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:设置系统字符集编码
JavaSE高级 - 点击查看当前系列文章
§ 11、常用命令 「 当前文章 」