本次练习在命令行下编译运行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 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包已经生成,目录如下图:
其中META-INF文件夹下的内容如下:
该MANIFEST.MF的内容如下:
如何运行该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命令