简介

在日常开发中,我们不可能给用户自己的开发项目来让用户来使用,常常我们都是只给用户提供一个单独的文件,而非一个包含大量类的目录结构。故java归档(JAR)文件就是为此目的而设计的。一个JAR文件既可以包含类文件,也可以包含图像,声音等其他文件。
jar文件更类似于一种压缩包(你甚至可以用压缩软件打开它)

创建方法

代码方式

创建jar 包的常用代码如下 jar cvf jarFileName file1 file2 ......

demo如下:

	jar cvf demoClasses.jar *.class icon.gif

在类文件,图像等替他资源外,jar文件中还有一个清单文件(manifest),用于描述归档文件的属性和特性。
清单文件被命名为MANIFEST.MF,位于JAR中的META-INF子目录。符合标准的最小清单文件极为简单,只有一条:Manifest-Version: 1.0
复杂的清单文件往往包含多节条目,第一节被称为主节,其他文件被指定命名实体的属性(比如单个文件,包,url等等)。他们都需要以一个Name条目开始,节与节之间用空行分开。

	Manifest-Version: 1.0
	
	Name: Demo.class

	Name: com/raven/demo

创建一个包含清单文件的jar文件方法:
jar cfm jarFileName manifestFileName ...

代码例子

	jar cfm Demo.jar manifest.mf com/raven/demo/*.class

更新manifest代码例子

	jar cfm Demo.jar manifest-additions.mf

IDEA方法

对于传统的代码而言,idea早已将这种开发整合在开发工具中。故可以直接使用 >file>project structure>Artifacts 点击加号选择jar from model.....后进行主类和文件配置即可。
图例如下:

QQ截图20210802112638.png

多版本JAR文件

为了解决多版本冲突,Java 9 引入了多版本JAR(multi-release JAR),其中可以包含面向不同Java版本的类文件

为了保证向后兼容,额外的类文件放在META-INF/versions

Application.class
BuildingBlocks.class
Util.class
META-INF
	MANIFEST.MF
	versions
	9
		Application.class
		BuildingBlocks.class
	10
		BuildingBlocks.class

java 8 完全不知道META-INF/versions目录,他只会直接加载类,java9读取这个java文件时就会使用新版本了。
要增加不同版本的类文件,可以使用--release表示:

	jar uf Demo.jar --release 9 Application.class

要从头构建一个多版本JAR文件,可以使用-C选项,对应每个版本要切换到一个不通的类文件目录:

	jar cf Demo.jar -C bin/8 . --release 9 -C bin/9 Application.class
	javac -d bin/8 --release 8 . . . 

在Java 9 中,-d选项会创建这个目录(如果目录不存在)