Java无难事:详解Java编程核心思想与技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.10 为Java程序打包

img

扫码看视频

1.10.1 JAR文件

前面我们已经介绍过,在编译Java源程序时,每个类都会单独编译为一个.class文件,但在一个大型项目中,可能会有上千个类,编译后就会生成上千个字节码文件,在部署或者其他人要使用这些类时,直接拷贝这上千个文件也是一件很让人头疼的事,为此,Java给我们提供了一个jar.exe工具,用于将这些分散的字节码文件压缩并打包到一个文件中,而这个文件就是JAR文件。

jar.exe在JDK安装目录的bin文件夹下,我们已经在1.7.1节的PATH环境变量下配置了该路径,所以可以在任意目录下直接执行该程序。打包后的JAR文件使用的是ZIP格式压缩的,所以可以使用7-Zip等压缩与解压缩软件,打开这些JAR文件来查看其中包含的内容。

1.10.2 将字节码文件打包到JAR包中

我们之前编写的Hello.java,在编译后生成了两个字节码文件Hello.class和Welcome.class。我们可以通过jar程序把这些文件打包到一个.jar文件中。打开命令提示符窗口,进入Hello程序所在的文件夹,输入下面的命令:

img

结果如图1-35所示。

img

图1-35 打包jar文件

在这个命令中,jar是程序名称,cvf是参数,其中c表示创建一个新的jar文件,v表示在标准输出中生成详细输出,f用于指定生成的jar文件名,这三个参数也是最常用的参数。如果想更进一步了解jar程序的其他参数,可以直接在命令提示符窗口中输入jar--help并按回车键,即可看到jar程序的详细用法。

1.10.3 将目录中所有文件打包到JAR文件中

上一节只是把一些字节码文件打包到JAR文件中,我们同样也可以把一个目录下的所有文件打包到JAR文件中。在命令提示符窗口中先退到F:\JavaLesson目录下,然后输入下面的命令:

img

结果如图1-36所示。

img

图1-36 打包文件夹下的所有文件

上面的命令把ch01文件夹中的所有文件都打包到了hello.jar文件中。

1.10.4 清单文件

用解压缩软件打开hello.jar文件,你会看到一个META-INF目录,在该目录中有一个MANIFEST.MF文件,这个文件就是清单文件,用于描述JAR文件的内容,并在运行时向JVM提供应用程序的信息。

用文本编辑工具打开这个默认生成的清单文件,可以看到其中的内容为:

img

内容的第一行说明清单文件的版本,第二行说明该文件是使用JDK 11.0.7版本的jar工具生成的。

清单文件的格式非常简单,每一行都是由名-值对组成的,格式为:属性名:属性值,属性名冒号(:)后面需要有一个空格。整个清单文件以一个空行结束。

我们感兴趣的属性是Main-Class,这个属性用于指定JAR文件中包含main方法的类,设置了该属性,就可以让一个JAR文件变成可执行的。在本例中,Hello类有一个main方法,在打包时,可以通过参数e指定Hello类为程序的主类。

先删除前面生成的JAR文件,进入ch01目录,执行下面的命令重新生成JAR文件。

img

再次用解压缩软件打开hello.jar,META-INF目录下的MANIFEST.MF文件内容如下所示:

img

现在就可以运行hello.jar程序了,在命令提示符窗口中,执行java.exe,使用-jar参数指定JAR文件,如图1-37所示。

img

图1-37 运行JAR文件

我们也可以提前编辑好清单文件,在打包时,使用参数m将清单文件一起打包到JAR文件中,这样就不需要在打包时指定包含main方法的类了。

新建一个名为manifest.mf的文本格式的文件,文件内容为:

img

记得在文件内容最后加一个空行。清单文件名是什么都无所谓,依照惯例,我们取名为:manifest.mf。

在命令提示符窗口中执行下面的命令,将清单文件也添加到JAR文件中。

img

继续执行下面的命令就可以看到程序的输出结果了。

img