JDK内置工具之jar

jar用于处理Java存档(JAR)文件。该命令是基于ZIPZLIB压缩格式的通用归档和压缩工具。但是,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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值