Java程序在命令行下编译运行打Jar包

时间:2022-03-29 14:17:33

本次练习在命令行下编译运行java程序,以及将java程序打jar包运行。

一、本程序有三个类,
Teacher类:

public class Teacher {
private String name;
private String subject;

Teacher() {};
Teacher(String name, String subject) {
this.name = name;
this.subject = subject;
}

public String getSubject(){
return this.subject;
}
public void teach() {
System.out.println(name + " is teaching " + subject);
}
}

Student类:

public class Student{
private String name;

public Student(){};
public Student(String name) {
this.name = name;
}

public void study(Teacher teacher){
teacher.teach();
System.out.println(name + " is studying " + teacher.getSubject());
}
}

Test类:

public class Test{
public static void main(String[] args) {
Student stu = new Student("Jack");
Teacher teacher = new Teacher("Teacher wang", "Program");
stu.study(teacher);
}
}

二、利用Windows命令行编译运行程序:

javac Student.java

javac Teacher.java

javac Test.java

运行上述命令后,目录下会生成同名的class文件。
Java程序在命令行下编译运行打Jar包

然后就可以执行下面的命令运行本程序:

java Test

运行结果:
Teacher wang is teaching Program
Jack is studying Program

三、如何将以上几个类打包成应用程序?

首先,在程序目录下新建一个manifest.mf文件,文件里写如下内容:
Main-Class: Test

然后运行如下一行命令:

jar cvfm test.jar manifest.mf Teacher.class Student.class Test.class

会打印出下面的信息:
已添加清单
正在添加: Teacher.class(输入 = 806) (输出 = 452)(压缩了 43%)
正在添加: Student.class(输入 = 748) (输出 = 449)(压缩了 39%)
正在添加: Test.class(输入 = 478) (输出 = 321)(压缩了 32%)

而且目录下会生成一个test.jar,是个压缩文件。到此时Jar包已经生成,目录如下图:
Java程序在命令行下编译运行打Jar包

其中META-INF文件夹下的内容如下:
Java程序在命令行下编译运行打Jar包

该MANIFEST.MF的内容如下:
Java程序在命令行下编译运行打Jar包

如何运行该Jar包呢?
在命令行运行如下命令即可:

java -jar test.jar

输出结果:
Teacher wang is teaching Program
Jack is studying Program

注意:如果在运行java -jar test.jar 命令运行程序时,出现如下错误:
test.jar中没有主清单属性

那么请查看jar包中的MANIFEST.MF文件,是否没有Main-Class那一行。

为什么会出现这种错误?
因为清单文件的格式有严格要求,注意:
Main-Class: Test的:后必须要有一个空格。而且这一行末尾必须再输入一个回车键,相当于两行。

附:
jar命令的简介(可运行”jar”命令来查看各个参数用法):

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