![Java无难事:详解Java编程核心思想与技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/35011059/b_35011059.jpg)
1.10 为Java程序打包
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_51.jpg?sign=1734469321-rpRdLsAa6iwiriZilkVEFpcGQNJqc2dX-0-c462cd1fb0081481a4f47801752ecad2)
扫码看视频
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](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_52.jpg?sign=1734469321-KSH45NWrxousImjN29hElOta4qp877u1-0-05dc022bbd6fad9ae09db2bd0463727a)
结果如图1-35所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1734469321-6xlUVECT8JCy5vhOUXtaWt9pu74ZOvGO-0-588a64eb17ff03f25c821b4050d2b8fc)
图1-35 打包jar文件
在这个命令中,jar是程序名称,cvf是参数,其中c表示创建一个新的jar文件,v表示在标准输出中生成详细输出,f用于指定生成的jar文件名,这三个参数也是最常用的参数。如果想更进一步了解jar程序的其他参数,可以直接在命令提示符窗口中输入jar--help并按回车键,即可看到jar程序的详细用法。
1.10.3 将目录中所有文件打包到JAR文件中
上一节只是把一些字节码文件打包到JAR文件中,我们同样也可以把一个目录下的所有文件打包到JAR文件中。在命令提示符窗口中先退到F:\JavaLesson目录下,然后输入下面的命令:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_54.jpg?sign=1734469321-LjiKFQtpV8hBH5pEtDd84r4K3Od3p1ot-0-18b980b50c7de5dd74c9b38fcdd78a7a)
结果如图1-36所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_55.jpg?sign=1734469321-9969NxvgprHhMNKbzvAuDAvZl4yv9UST-0-d33bce1e02cb60d6860dd890833c796a)
图1-36 打包文件夹下的所有文件
上面的命令把ch01文件夹中的所有文件都打包到了hello.jar文件中。
1.10.4 清单文件
用解压缩软件打开hello.jar文件,你会看到一个META-INF目录,在该目录中有一个MANIFEST.MF文件,这个文件就是清单文件,用于描述JAR文件的内容,并在运行时向JVM提供应用程序的信息。
用文本编辑工具打开这个默认生成的清单文件,可以看到其中的内容为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_56.jpg?sign=1734469321-UuAS2Oy4IkMpk8B3XLDWUHFrjGIwBQ3Y-0-f1e86c14bf9b1c4523086a992339c9f4)
内容的第一行说明清单文件的版本,第二行说明该文件是使用JDK 11.0.7版本的jar工具生成的。
清单文件的格式非常简单,每一行都是由名-值对组成的,格式为:属性名:属性值,属性名冒号(:)后面需要有一个空格。整个清单文件以一个空行结束。
我们感兴趣的属性是Main-Class,这个属性用于指定JAR文件中包含main方法的类,设置了该属性,就可以让一个JAR文件变成可执行的。在本例中,Hello类有一个main方法,在打包时,可以通过参数e指定Hello类为程序的主类。
先删除前面生成的JAR文件,进入ch01目录,执行下面的命令重新生成JAR文件。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_57.jpg?sign=1734469321-ZK04CjpYIORYaGP86fXQW5UUQUVAazFi-0-f560ea45425d57b3994e0b9644f18265)
再次用解压缩软件打开hello.jar,META-INF目录下的MANIFEST.MF文件内容如下所示:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_58.jpg?sign=1734469321-210hKlR7Vb7tmPEiFTWF3rZ0Xf4kerj9-0-de083693ae5dd71dacb890ebf44c9e23)
现在就可以运行hello.jar程序了,在命令提示符窗口中,执行java.exe,使用-jar参数指定JAR文件,如图1-37所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_59.jpg?sign=1734469321-vcr9WDbgHurt3Ugrt8smoslv6lFeSdG0-0-fc5f2da1e01b56b13dc9f6af3cc4c945)
图1-37 运行JAR文件
我们也可以提前编辑好清单文件,在打包时,使用参数m将清单文件一起打包到JAR文件中,这样就不需要在打包时指定包含main方法的类了。
新建一个名为manifest.mf的文本格式的文件,文件内容为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_60.jpg?sign=1734469321-YBlSyGPUbCIgKCKPq4yBMIgYoE4WRE4o-0-49208989e5a83504ace7d65069ff5a3f)
记得在文件内容最后加一个空行。清单文件名是什么都无所谓,依照惯例,我们取名为:manifest.mf。
在命令提示符窗口中执行下面的命令,将清单文件也添加到JAR文件中。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_61.jpg?sign=1734469321-UEENgmYT5xGkjgWYdLvGQSQAjQkL1Yyl-0-f41cec6c36164778801b2713fec92ef5)
继续执行下面的命令就可以看到程序的输出结果了。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_62.jpg?sign=1734469321-V3jmPiGTTQXoYK8ZP5N1hHRAaN9ikRts-0-07e058b4ec0965f01b20a57ab8b8c342)