6.12.1 jar命令详解
jar是随JDK自动安装的,在JDK安装目录下的bin目录中,Windows下文件名为jar.exe, Linux下文件名为jar
查看jar帮助文档
在CMD中输入jar,可以看到jar命令的帮助文档.
1 | C:\Users\lan>jar |
1. 创建JAR文件
命令:jar cf test.jar -C dist/ .
1 | -c 创建新档案 |
将当前路径下的dist路径下的全部内容生成一个test.jar文件。如果当前目录中已经存在test.jar文件,那么该test.jar文件将被覆盖。
2. 创建JAR文件 并显示压缩过程
命令:jar cvf test.jar -C dist/ .
1 | -c 创建新档案 |
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>jar cvf test.jar -C dist/ . |
3. 不使用清单文件
命令:jar cvfM test.jar -C dist/ .
1 | -c 创建新档案 |
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>jar cvfM test.jar -C dist/ . |
该命令的结果与第2个命令类似,其中M选项表明不生成清单文件。因此生成的test.jar中没有包含清单文件(META-INF/MANIFEST.MF),打包过程的信息也略有差别。
4. 自定义清单文件内容
命令格式:jar cvfm JAR保存路径 清单文件路径 -C 目录 文件
运行结果与第2个命令相似,显示信息也相同,其中小写的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 -C dist/ .
实例
目录结构
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12 |
a.txt文件内容:
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>type a.txt |
将a.txt中的内容添加到清单文件中:
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>jar cvfm test.jar a.txt -C dist/ . |
生成的清单文件内容:
1 | Manifest-Version: 1.0 |
5. 查看JAR包内容
命令:jar tf test.jar
1 | -t 列出档案目录 |
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>jar tf test.jar |
当JAR包中的文件路径和文件非常多时,因为命令行窗口能显示的行数有限,所以直接执行该命令,可能无法看到包的全部内容,此时可利用重定向将显示结果保存到文件中。例如,采用如下命令:jar tf test.jar > test.txt
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>jar tf test.jar > test.txt |
6. 查看JAR包详细内容
命令:jar tvf test.jar
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>jar tvf test.jar |
7. 解压缩
命令:jar xf test.jar,这个命令会解压到当前目录下。
1 | -x 从档案中提取指定的 (或所有) 文件 |
示例
jar xf JAR包默认解压在当前路径下,为了观察明显,先把test.jar复制到其他地方.
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>copy test.jar Copy |
然后再解压
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12>cd Copy |
解压后的效果如下:
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12\Copy>mytree f |
8. 带提示信息解压缩
命令:jar xvf test.jar
这个命令的解压缩效果与第7个命令相同,但系统会显示解压过程的详细信息。
1 | G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.12\Copy>jar xvf test.jar |
9. 更新JAR文件
命令:jar uf test.jar Hello.class,这个命令会更新test.jar中的Hello.class文件。如果test.jar中已有Hello.class件,则使用新的Hello.class文件替换原来的Hello.class文件;如果test.jar中没有Helo.class文件,则把新的Hello.class文件添加到test.jar文件中。
10.更新时显示详细信息
命令:jar uvf test.jar Hello.class
1.11 创建多版本JAR包
多版本JAR包是JDK9新增的功能,它允许在同一个JAR包中包含针对多个Java版本的cass文件。JDK9为jar命令增加了一个 --release选项,用于创建多版本JAR包,注意,只有Java9之后才支持多版本JAR包。
如何使用指定版本的Java进行编译
在使用多版本JAR包之前,可以使用Javac的--release选项针对指定Java版本进行编译。比如命令:javac --release 7 Test java
上面命令代表使用Java7的语法来编译Test java。如果你的Test java中使用了Java8或Java9的语法,程序将会编译失败。
如果创建多版本JAR包
假如将针对Java7编译的所有class文件放在dist7目录下,针对Java9编译的所有class文件放在dist目录下。接下来可用如下命令来创建多版本JAR包:jar cvf test.jar -C dist7/ . --release 9 -C dist/ .
特定版本在JAR包中的位置
这样就创建了一个多版本JAR包,在该多版本JAR包内,特定版本的文件位于META-INF/versions/N目录下,其中N代表版本号。
原文链接: 6.12.1 jar命令详解