jar
用于处理Java
存档(JAR
)文件。该命令是基于ZIP
和ZLIB
压缩格式的通用归档和压缩工具。但是,jar
命令主要用于将Java applet
或应用程序
打包到单个存档中。将小应用程序或应用程序的组件(文件,图像和声音)组合到单个存档中时,可以由Java
代理(例如浏览器)在单个HTTP
事务中下载它们,而无需为每个组件都建立新的连接片,这样可以缩短下载时间。同时,jar
命令还可以压缩文件,从而进一步缩短了下载时间。jar
命令还允许小程序作者对文件中的各个条目进行签名,以便可以验证其来源。无论是否压缩,JAR
文件都可以用作类路径条目。
jar
命令的语法类似于tar
。具有几种操作模式,由强制操作参数之一定义。其他参数是修改操作行为的选项,或者是执行操作所需的操作数。
基本用法:jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
。
其中ctxui
是操作参数,后面为对应选项,细分操作用法如下:
创建JAR
文件:jar c[efmMnv0] [entrypoint] [jarfile] [manifest] [-C dir] file ... [-Joption ...] [@arg-file ...]
更新JAR
文件:jar u[efmMnv0] [entrypoint] [jarfile] [manifest] [-C dir] file ... [-Joption ...] [@arg-file ...]
提取JAR
文件:jar x[vf] [jarfile] file ... [-Joption ...] [@arg-file ...]
列出JAR
文件的内容:jar t[vf] [jarfile] file ... [-Joption ...] [@arg-file ...]
将索引添加到JAR
文件:jar i jarfile [-Joption ...] [@arg-file ...]
可用操作参数如下:
使用
jar
命令时,必须通过指定以下操作参数之一来选择要执行的操作。可以在命令行上将它们与其他一个字母的选项混合使用,但是通常操作参数是指定的第一个参数。
c 创建一个新的JAR归档文件
i 生成JAR存档的索引信息
t 列出JAR归档文件的内容
u 更新JAR存档
x 从JAR存档中提取文件
可用选项如下:
使用以下选项来自定义如何创建,更新,提取或查看JAR文件,搭配操作参数混合使用
e 为捆绑到可执行jar文件的独立应用程序指定应用程序入口点。
使用此选项可以创建或覆盖清单文件中Main-Class的属性值。
在创建(c)或更新(u)JAR文件时搭配此选项使用
f 指定档案文件名。
在创建(c),更新(u),提取(x)或查看(t)JAR文件时搭配此选项使用。
省略该选项和jarfile操作数表示通过输入流指定读取文件或写入的文件名称
m 包含指定清单文件中的清单信息。
在jar文件的清单文件manifest(位于的存档中META-INF/MANIFEST.MF)中创建或更新属性值。
在创建(c),更新(u)JAR文件时搭配此选项使用
M 不创建条目的清单文件,或在清单文件条目存在时删除。
在创建(c)或更新(u)JAR文件时时搭配此选项使用
n 创建新档案后执行 Pack200 规范化。
使内容不受pack200(1)命令的打包和拆包操作影响。
如果不进行这种标准化,则已签名的JAR的签名可能变得无效
在创建(c)JAR文件时时搭配此选项使用
v 在标准输出中生成详细输出
0 仅存储; 不使用任何 ZIP 压缩,即在不使用ZIP压缩的情况下创建(c)或更新(u)JAR文件
-C dir 创建(c)或更新(u)JAR文件时,此选项在处理文件操作数指定的文件时会临时更改目录
-Joption 设置在JRE运行JAR文件时要使用的指定JVM选项。
其他参数说明:
file 创建(c)或更新(u)JAR文件时,定义应添加到归档文件中的文件或目录的路径和名称。
提取(x)或列出tJAR文件的内容(t)时,定义要提取或列出的文件的路径和名称。
必须至少指定一个有效的文件或目录,多个文件用空格分隔。
如果是entrypoint,、jarfile或者manifest操作,则必须在它们之后指定file
entrypoint 创建(c)或更新(u)JAR文件时,定义入口点类的名称。
该类的名称应为捆绑到可执行JAR文件中的独立Java应用程序的入口点。
同时必须指定e选项
jarfile 定义要创建(c)、更新(u)、提取(x)或查看(t)的文件的名称。
索引(i)JAR文件时,需要指定不含有jarfile的选项f
manifest 在创建(c)或更新(u)JAR文件时,在MANIFEST.MF中定义具有名称和属性值的清单文件属性。
同时必须指定f选项
@arg-file 为了缩短或简化jar命令,可以在一个单独的文本文件中指定参数。
将其以(@)作为前缀传递给命令。
当jar命令遇到以@符号开头的参数时,它将将该文件的内容扩展到参数列表中。
参数文件可以包含jar命令的选项和参数
(-J选项除外,因为它们传递给了不支持参数文件的启动器)。
文件中的参数可以用空格或换行符分隔。
参数文件中的文件名是相对于您从中运行jar命令的当前目录的,而不是参数文件的位置。
不扩展通配符,例如星号(*),否则它们可能会被操作系统外壳扩展
下面通过几个示例演示一下jar的用法
示例一:使用详细输出从当前目录添加所有文件
准备一个文件夹,示例文件夹内容如下
2021/01/18 10:02 1,137 JAbstractJavaFileObject.class
2021/01/18 10:02 1,665 JCompileBytesClassLoader.class
2021/01/18 10:02 3,216 JCompileResult.class
2021/01/18 10:02 4,866 JMemoryJavaCompiler.class
2021/01/18 10:02 2,032 JMemoryJavaFileManage.class
2021/01/18 10:02 1,030 JMemoryJavaFileObject.class
2021/01/18 10:02 913 JStringJavaFileObject.class
输入命令:jar cvf bundle.jar *
,观察执行结果
$ jar cvf bundle.jar *
已添加清单
正在添加: JAbstractJavaFileObject.class(输入 = 1137) (输出 = 566)(压缩了 50%)
正在添加: JCompileBytesClassLoader.class(输入 = 1665) (输出 = 828)(压缩了 50%)
正在添加: JCompileResult.class(输入 = 3216) (输出 = 1433)(压缩了 55%)
正在添加: JMemoryJavaCompiler.class(输入 = 4866) (输出 = 2215)(压缩了 54%)
正在添加: JMemoryJavaFileManage.class(输入 = 2032) (输出 = 867)(压缩了 57%)
正在添加: JMemoryJavaFileObject.class(输入 = 1030) (输出 = 536)(压缩了 47%)
正在添加: JStringJavaFileObject.class(输入 = 913) (输出 = 486)(压缩了 46%)
执行结束后,可以在当前目录下看到新生成的bundle.jar
文件
示例二:从子目录添加文件
准备一个文件夹,该文件夹内部包含子文件夹,示例文件夹内容如下
2021/01/27 09:55 <DIR> compiler
输入命令:jar cvf bundle.jar compiler
,观察执行结果
$ jar cvf bundle.jar compiler
已添加清单
正在添加: compiler/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: compiler/JAbstractJavaFileObject.class(输入 = 1137) (输出 = 566)(压缩了 50%)
正在添加: compiler/JCompileBytesClassLoader.class(输入 = 1665) (输出 = 828)(压缩了 50%)
正在添加: compiler/JCompileResult.class(输入 = 3216) (输出 = 1433)(压缩了 55%)
正在添加: compiler/JMemoryJavaCompiler.class(输入 = 4866) (输出 = 2215)(压缩了 54%)
正在添加: compiler/JMemoryJavaFileManage.class(输入 = 2032) (输出 = 867)(压缩了 57%)
正在添加: compiler/JMemoryJavaFileObject.class(输入 = 1030) (输出 = 536)(压缩了 47%)
正在添加: compiler/JStringJavaFileObject.class(输入 = 913) (输出 = 486)(压缩了 46%)
执行结束后,可以在当前目录下看到新生成的bundle.jar
文件
示例三:列出JAR的内容
直接用示例二中生成的bundle.jar
文件进行演示
输入命令:jar tf bundle.jar
,观察执行结果
$ jar tf bundle.jar
META-INF/
META-INF/MANIFEST.MF
compiler/
compiler/JAbstractJavaFileObject.class
compiler/JCompileBytesClassLoader.class
compiler/JCompileResult.class
compiler/JMemoryJavaCompiler.class
compiler/JMemoryJavaFileManage.class
compiler/JMemoryJavaFileObject.class
compiler/JStringJavaFileObject.class