![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=1739568674-qsyYNnBbaRlBGwsQc9S1GE0Yx11oXsAZ-0-ad663e407f8e4c933971977ae28da2f2)
扫码看视频
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=1739568674-GZUofYwr8VlxHidq5uT7BBl7NqHGWXNR-0-13c64e2e80a4b98ddc2c60b22faf11a1)
结果如图1-35所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1739568674-qRqHCEiiLJrF8u8aTlRq0JJVsZoLmIET-0-7683dd6b406ea1d34f4e05bf2f87b879)
图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=1739568674-M9t3X4umg4DJ9jY5Gx8L0hcK28Nsd6Ap-0-f6db70dfe400fd5f895500e172a3b420)
结果如图1-36所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_55.jpg?sign=1739568674-0LkJMvlTsq4jnyp20BU3BOrYUmUZNsrV-0-8fa8bf23243a37550fb7ace2404da17e)
图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=1739568674-d8ohKyXiECerXVwJqPryHH2xgOBBYhYn-0-bc37363b94f8c9c3328e9ef745afcb0a)
内容的第一行说明清单文件的版本,第二行说明该文件是使用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=1739568674-BicKGm0zlFYnrQe9uT9vgX7piZ8D1AZO-0-c7f862fb3ea4481a5b05aba4ed398a98)
再次用解压缩软件打开hello.jar,META-INF目录下的MANIFEST.MF文件内容如下所示:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_58.jpg?sign=1739568674-vltijaABOtKAxgUoyUIqFc0NPEwsYvwX-0-931765ff1c9d664980cb3da5d24c102b)
现在就可以运行hello.jar程序了,在命令提示符窗口中,执行java.exe,使用-jar参数指定JAR文件,如图1-37所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_59.jpg?sign=1739568674-rS146L434sY7pFnyxYhZsWpXgiM3VXV6-0-1e94f6094d5d42911484836a58c9ee5d)
图1-37 运行JAR文件
我们也可以提前编辑好清单文件,在打包时,使用参数m将清单文件一起打包到JAR文件中,这样就不需要在打包时指定包含main方法的类了。
新建一个名为manifest.mf的文本格式的文件,文件内容为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_60.jpg?sign=1739568674-E995qkGm6Kl7qk5XNvqwrv4036EKo2C6-0-3420ca572832397fb6e6a7e11fbb0e88)
记得在文件内容最后加一个空行。清单文件名是什么都无所谓,依照惯例,我们取名为:manifest.mf。
在命令提示符窗口中执行下面的命令,将清单文件也添加到JAR文件中。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_61.jpg?sign=1739568674-MPirwZwoB99iYYIszNSswFp6JAvWj0bt-0-0720acd9bb5c6f4ff3d0e6a6357f25f0)
继续执行下面的命令就可以看到程序的输出结果了。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_62.jpg?sign=1739568674-9MsQcD3iHqL5qBgVXfeKg09rbBTTZ6uu-0-909b7b4915a3004fdc53fb1034b8c211)