![Java无难事:详解Java编程核心思想与技术(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/851/47548851/b_47548851.jpg)
1.10 为Java程序打包
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程序所在的文件夹,输入下面的命令:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_36_4.jpg?sign=1739006187-cq8RXi34WhWA4bP28vXp0HH753Umr0uC-0-e1d5d7674f3b7761a9a74cbe61f75411)
结果如图1-35所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_37_1.jpg?sign=1739006187-wy4PlJ9XTHVmvR9r0tyRfrog59WKSCGO-0-9c3edc6e5644c36c023152397c554061)
图1-35 打包jar文件
在这个命令中,jar是程序名称,cvf是参数,其中c表示创建一个新的jar文件,v表示在标准输出中生成详细输出,f用于指定生成的jar文件名,这三个参数也是最常用的参数。如果想更进一步了解jar程序的其他参数,可以直接在命令提示符窗口中输入jar--help并按回车键,即可看到jar程序的详细用法。
1.10.3 将目录中所有文件打包到JAR文件中
上一节只是把一些字节码文件打包到JAR文件中,我们同样也可以把一个目录下的所有文件打包到JAR文件中。在命令提示符窗口中先退到F:\JavaLesson目录下,然后输入下面的命令:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_37_2.jpg?sign=1739006187-8kIhZOTbS1KvaWEvQseSymgdNABjZDEL-0-f8947c33355d6f3dc053f67a06c644ed)
结果如图1-36所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_37_3.jpg?sign=1739006187-M0SpZx7HPbXVDJByqoZHNxC3tQ7OtIyT-0-3b2688e39e16ecaaa6db392b8b05e453)
图1-36 打包文件夹下的所有文件
上面的命令把ch01文件夹中的所有文件都打包到了hello.jar文件中。
1.10.4 清单文件
用解压缩软件打开hello.jar文件,你会看到一个META-INF目录,在该目录中有一个MANIFEST.MF文件,这个文件就是清单文件,用于描述JAR文件的内容,并在运行时向JVM提供应用程序的信息。
用文本编辑工具打开这个默认生成的清单文件,可以看到其中的内容为:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_37_4.jpg?sign=1739006187-PzX9XLapKYpDnPFUY9ihh3tYuoYqzud5-0-c1f6001fb740563650b4f0b092184c4e)
内容的第一行说明清单文件的版本,第二行说明该文件是使用JDK 11.0.7版本的jar工具生成的。
清单文件的格式非常简单,每一行都是由名-值对组成的,格式为:属性名:属性值,属性名冒号(:)后面需要有一个空格。整个清单文件以一个空行结束。
我们感兴趣的属性是Main-Class,这个属性用于指定JAR文件中包含main方法的类,设置了该属性,就可以让一个JAR文件变成可执行的。在本例中,Hello类有一个main方法,在打包时,可以通过参数e指定Hello类为程序的主类。
先删除前面生成的JAR文件,进入ch01目录,执行下面的命令重新生成JAR文件。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_38_1.jpg?sign=1739006187-HXw94FHJFX2KI7Yribc7SMHReNEz4NBL-0-9c9ecb072a84699b9a8b2e67092ce804)
再次用解压缩软件打开hello.jar,META-INF目录下的MANIFEST.MF文件内容如下所示:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_38_2.jpg?sign=1739006187-cm1CIggLtkRWsG4dR1NwqaRfwlaQQ0qc-0-843a5ae5a404e481da688994b31d2a1d)
现在就可以运行hello.jar程序了,在命令提示符窗口中,执行java.exe,使用-jar参数指定JAR文件,如图1-37所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_38_3.jpg?sign=1739006187-thgMafyma0vPhOb03t8uqfSzjNm3f5DA-0-212a25afb32d1ebecbfe39377f927cc4)
图1-37 运行JAR文件
我们也可以提前编辑好清单文件,在打包时,使用参数m将清单文件一起打包到JAR文件中,这样就不需要在打包时指定包含main方法的类了。
新建一个名为manifest.mf的文本格式的文件,文件内容为:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_38_4.jpg?sign=1739006187-VmNT0v6QrXrfW8Z7QFF2ui84m7iJNTHx-0-f06f374f8dbb78cead5aca1ca3dfa02c)
记得在文件内容最后加一个空行。清单文件名是什么都无所谓,依照惯例,我们取名为:manifest.mf。
在命令提示符窗口中执行下面的命令,将清单文件也添加到JAR文件中。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_38_5.jpg?sign=1739006187-8cZi6sFUfJQgYIcxk1VOGYdoYP5v4KHx-0-19d2b91e6397406b1a439b2484e28bc0)
继续执行下面的命令就可以看到程序的输出结果了。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_38_6.jpg?sign=1739006187-OCA93MCrpCKOcZMobaYiB6XQ3Duk4YdX-0-48252a3142f1bfbea7be5741f3cb23ce)