概述:JAR是英文Java Archive File的简写,翻译过来的意思是Java归档文件;归档一词用在软件开发领域可以理解为将软件开发过程中形成的具有一定价值的成果物(Java领域诸如类、配置、静态资源等),内部文件保持有机联系,遵循文件的相应规律统一整理的过程。JAR文件设计的目的在于有的时候想向用户提供一个单独的文件,而不是包含大量类文件的目录结构。JAR文件就是为了此目的而设计的,既可以节省空间和改善性能。一个JAR文件既可以包含类文件,也可以包含图像和声音等其它类型的文件,甚至可以包含JAR等资源;另外JAR文件是使用了ZIP压缩格式进行压缩的,所以我们可以使用普通的解压缩软件就可以打开它。
接下来依次从以下几个方面讲解JAR:
- JAR文件的组成
- 创建JAR文件
- 可执行JAR文件
1、JAR文件的组成
首先我们以fastjson-1.2.60.jar(作为日常JAR代表)和first-app-by-gui-0.0.1.jar(作为非日常JAR)举例子。对两者解压,根目录组成如下图:
通过上图得知:不同JAR包中内容可能不一样,但都会包含一个META-INF的目录;因此可以简单理解为JAR中包含两类目录:META-INF目录和META-INF之外的目录。
META-INF之外的目录:可以理解为资源目录,一般存放类文件、依赖JAR以及图片或视频等资源;大体某一类资源会放到单独的目录下,且目录的命名一般根据类文件的包名或者清单文件中某些属性配置的一致,在此不做赘述;
META-INF目录:每个JAR文件中还包含一个清单文件(MANIFEST.MF),用来描述归档文件的特殊特性且这个清单文件如果不做特殊设置必须位于META-INF目录中,这算是一个规定吧。这个清单文件的内容复杂度随归档文件而定,一个Springboot应用的清单内容如下。需要注意的是:一般来说在清单文件中配置的内容会被归档文件中某些逻辑读取,这个了解下即可;
Manifest-Version: 1.0
Implementation-Title: first-app-by-gui
Implementation-Version: 0.0.1
Built-By: Administrator
Implementation-Vendor-Id: thinking-in-spring-boot
Spring-Boot-Version: 2.0.2.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.dongnao.FirstAppByGuiApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_144
Implementation-URL: https://projects.spring.io/spring-boot/#/spring-boot-starter-parent/first-app-by-gui
2、创建JAR文件
创建一个新JAR文件常用的命令格式为:jar options jarFileName file1 file2 ...;该命令类似于UNIX中的tar命令,其中options是命令选项,file既可以为文件名称也可以为目录名,采用路径时jar命令将进行递归获取目录下文件,选项列表和日常用法如下图:
3、可执行JAR文件
一般在清单文件中例如通过Main-Class: org.springframework.boot.loader.JarLauncher的方式来指定程序的主类,需要注意的是主类为类的全路径名且不需要扩展名,指定主类后我们可以通过java -jar Test.jar简单的命令来启动程序;简单来说当我们采用java -jar命令启动程序后,会去清单内查找是否已配置Main-Class,如果未配置提示找不到主类;一般来说可执行jar用的不多,常规jar偏多,但随着近几年Springboot应用的普及,可执行JAR被广泛应用于各个场景中,需要注意的是通过java -jar启动程序是属于JAVA早就提供的命令,各种应用JAR依然要遵守规范,只是Springboot使它火热而已!
4、多版本JAR文件
简单来说是随着JDK版本更替,在老版本用到的类会出现过时、重命名为其它类甚至删除掉,那么在新老应用中需要做针对性的调整,比如在JAVA7中用到A和B两个类,那么到了JAVA9由于A和B被替代,需要调整为C和D这种情形,对此从JAVA9开始引入了多版本JAR来提供解决这一问题的手段。简单来说就是在META-0INF中创建对应文件夹和通过命令来指定,由于不是特殊行业使用场景不多,在此不赘述!
以上,完了!