关于jar包的一切——java笔记

jar包简介

本文大部分内容参考疯狂java讲义一书。仅仅作为自身学习,查缺补漏之用,如有转载请把本书名附上。


JAR文件的全称是Java Archive File,意思就是Java档案文件。通常JAR文件是一种压缩文件,与常见的ZIP压缩文件兼容,同城也被称为JAR包。JAR文件与zip文件的去区别就是在JAR文件中默认包含了一个名为META-INF/MANIFEST.MF的清单文件,这个清单文件是在生成JAR文件时系统自动创建的。

当开发了一个应用程序后,这个应用程序包含了很多类,如果需要把这个应用程序提供给别人使用,通常会将这些类文件打包成一个JAR文件,把这个JAR文件提供给别人使用。只要别人在系统的CLASSPATH环境变量中添加这个JAR文件,则Java虚拟机就可以自动在内存中解压这个JAR包,把这个JAR文件当成一个路径,在这个路径中查找所于晓的类或宝层次对应的路径结构。

使用JAR文件有以下好处:

  • 安全。能够对JAR文件进行数字签名,只让能够识别数字签名的用户使用里面的东西。
  • 加快下载速度。在网上使用applet时,如果存在多个文件而不打包,为了能够把每个文件都下载到客户端,需要为每个文件单独建立一个HTTP连接,这是非常耗时的工作。将这些文件压缩成一个JAR包,只要建立一个http连接就能够一次下载所有的文件。
  • 压缩。使文件变小,JAR的压缩机制和zip完全相同
  • 包封装。能够让JAR包里面的文件依赖于统一版本的类文件。
  • 可一致性。JAR包作为内嵌在Java平台内部处理的标准,能够在各种平台上直接使用。

jar包可以有一个特殊的/META-INF/MANIFEST.MF文件来指定Main-Class

把一个JAR文件添加到系统的classpath环境变量中后,Java将会把这个jar文件当成一个路径来处理。实际上jar文件就是一个路径,jar文件通常使用jar命令压缩而成,当使用jar命令压缩生成jar文件时,可以把一个或者多个路径全部压缩成一个jar文件。

jar命令详解

jar是随jkd自动安装的,在jdk安装目录下的bin目录中,windows下文件名为jar.exe, Linux下文件名为jar。运行它需要用到jdk安装目录下lib目录中的tools.jar文件,通常系统会自动加载tools.jar,无须显示配置。

如果下命令行窗口运行不带任何参数的jar命令,系统将会提示jar命令的用法,提示信息如果图所示

关于jar包的一切——java笔记_第1张图片

1.创建jar文件:jar cf test.jar test

该明林没有显示圧缩过程,执行结果是将当期那路径下的test路径下的全部内容生成一个test.jar文件,如果当前目录中已经存在test.jar文件,那么该文件将被覆盖。

2.创建jar文件,并显示圧缩过程:jar cvf test.jar test

该命令的结果与第一个命令相同,但是由于v参数的作用,显示出了打包过程

3.不使用清单文件:jar cvfM test.jar test

该命令的结果与第二个命令类似,其中M选项表明不生成清单文件(其实这种方式和zip文件没什么两样了,只是文件后缀不一样而已)。因此生成的test.jar中没有包含 MEAT-INF/MANIFEST.MF文件,打包过程的信息也略有差别

4.自定义清单文件内容: jar cvfm test.jar manifest.mf test

运行结果与第二个命令相似,显示信息也相同,其中m选项指定读取用户清单文件信息,因此在生成的jar包中清单文件META-INF/MANIFEST.MF的内容有所不同,它会在原有清单文件基础上增加MANIFEST.MF文件的内容

当开发者向MANIFEST.MF清单文件中增加自己的内容时,就需要借助于自己的清单文件了,清单文件只是一个普通的文本文件,使用记事本编辑即可。清单文件的内容由如下格式的多个Key-value对组成。

key:<空格>value

清单文件的内容格式要求如下:

  • 每行只能定义一个Key-value对,每行的Key-value对之前不能有空格,即Key-value对必须顶格写。
  • 每组Key-value对之间以“: ”英文冒号后紧跟一个英文空格分隔,少写了冒号或者空格都是错误的。
  • 文件开头不能有空行
  • 文件必须以一个空行结束。

可以将上面文件保存在任意位置,以任意文件名存放。例如将上面文件保存在当前路径下,文件名为a.txt.使用如下命令即可将清单文件中的Key-value对提取到META-INF/MANIFEST.MF文件中。

jar cvfm test.jar a.txt test

5.查看jar包内容:jar tf test.jar

在test。jar文件已经存在的前提下,使用此命令可以查看test.jar中的内容。例如,对使用第二个命令生成的test.jar执行此文件,结果如下:

META-INF/
META-INF/MANIFEST.MF
test/
test/Test.class
test/Test.java

另外考虑到很多命令不是很实用,那么下面只列出部分命令的写法,具体就不解释了,详情可以参考疯狂java一书236页

6.查看JAR包详细内容:jar tvf test.jar

7.#解压缩:jar xf test.jar

8.带提示信息的解压缩:jar xvf test.jar

9.更新JAR文件:jar uf test.jar Hello.class

10.更新时显示详细信息:jar uvf test.jar Hello.class

创建可执行的jar包

当一个应用程序开发成功后,大致有三种发布方式。

  • 使用平台相关的编译器将整个应用编译成平台相关的可执行文件。这种方式常常需要第三方编译器的支持,而且编译生成的可执行文件丧失了跨平台特性,甚至可能有一定的性能下降。
  • 为应用编辑一个批处理文件。以Windows操作系统威力,批处理文件中只需要定义如下命令:

java package.MainClass

当用户点击上面的批处理文件时,系统将执行批处理文件的java命令,从而运行程序的主类。如果不想保留运行java程序的命令行窗口,也可以在批处理文件中定义如下命令:

start javaw package.MainClass

  • 将一个应用程序制作成可执行的jar包,通过jar包来发布应用程序

把应用程序压缩成jar包来发布是比较典型的做法,如果开发者把整个应用制作成一个可执行的jar包交给用户,那么用户使用起来就方便了。在windows下安装jre时,安装文件会将.jar文件映射成由javaw.exe打开。对于一个可执行的jar包,用户只需要双击它就可以运行程序了,和阅读.chm文档一样方便(*. chm文档默认是由hh.exe打开的)。下面介绍如何制作可执行的jar包。
创建可执行的jar包的关键在于:让javaw命令知道jar包中哪个类是主类,javaw命令可以通过运行该主类来运行程序。

jar命令有一个-e选项,该选项指定jar包中作为程序入口的主类的类名。因此,制作一个可执行的jar包只要增加-e选项即可,例如如下命令:

jar cvfe test.jar test.Test test

上面命令把test目录下的所有文件都压缩到test.jar包中,并指定使用test.Test类(如果主类带包名,此处必须指定完整类名)作为程序的入口。

运行上面的jar包邮两种方式。

  • 使用java命令,使用java运行的语法是:java -jar test.jar
  • 使用java命令,使用javaw运行时的语法是:javaw test.jar

当创建jar包时,所有的类都必须放在与包结构对应的目录结构中,就像上面-e选项指定的Test类,表明入口类为Test。因此,必须在jar包下包含Test.class文件。

关于jar包的技巧

jar文件前面已经说过,实际上就是zip文件,所以可以使用一些常见的解压缩工具来解压缩jar文件,如windows下的winrar、winzip等,以及linux下的unzip等,使用winrar和winzip等工具比使用jar命令更加直观、方便;而使用unzip则可以通过-d选项来指定目标目录。

解压缩一个jar文件时不能使用jar的-C选项来指定解压的目标目录,因为=C选项只在创建或者更新包时可用,如果需要将文件加压缩到指定目录下,则需要先将jar文件拷贝到目标目录下,再进行解压缩。如果使用unzip,就无需这么麻烦了,只需要指定一个-d选项即可。例如

unzip test.jar -d dest/

使用winra则更加方便(这也就是为什么上面的命令被我省略了一大部分的原因,因为我们大概有很多时候是用win系统来进行开发的)

如果不喜欢jar命令的字符界面,也可以使用winrar工具来创建jar包。因为winrar工具创建压缩文件时不会自动添加清单文件,所以需要手动添加清单文件,即需要手动简历META-INF路径,并在该路径下简历一个MANIFEST.MF文件,该文件中至少需要如下两行:

Mainfest-Version:1.0
Created-By: 1.8.0(Oracle Corporation)

上面的MANIFEST.MF文件是一个格式敏感的文件,该文件的格式要求与前面自定义清淡的格式要求完全一样。

接下来选中需要被压缩的文件、文件夹和META-INF文件夹,单击右键弹出右键菜单,单击“添加到压缩文件(A)”菜单项,填入压缩后的文件名和指定压缩成ZIP格式,然后点确定,这样一样与使用jar命令生成的jar包没有任何区别。

除此之外,java还可能生成两种压缩包:WAR包和EAR包。其中WAR文件是Web Archive File.它对应一个web应用文档;而EAR文件就是Enterprise Archive File,它对应于一个企业应用文档(通常由web应用和EJB两个部分组成)实际上,war包和ear包的压缩格式以及压缩方式与jar包完全一样,只是改变了文件后缀而已。

你可能感兴趣的:(【Java】)