jar 、war、ear
尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务。 当我必须重复做某事或作为脚本的一部分来做时,尤其如此。 在本文中,我将研究如何使用jar命令来创建,查看和操作Java归档文件。
JAR文件将主要在本文中使用,但我在.jar
文件上演示的命令与.war
和.ear
文件一致。 还要记住, JAR格式基于ZIP格式,因此可用于处理ZIP文件的众多工具可以应用于JAR,WAR和EAR文件。 还应记住, jar
选项倾向于镜像tar
的选项 。
对于我的示例,我想打包并使用一些.class
文件。 下一个屏幕快照演示将一些Java源代码文件( .java
文件)编译为.class
文件。 这些文件的实际来源对于本次讨论无关紧要,此处未显示。 在本文中,我已经展示了在没有IDE的情况下进行编译,这与使用命令行工具保持一致。
准备要在
下一个屏幕快照显示了我的.class
文件已被编译并准备好包含在JAR中。
创建一个JAR文件
jar
命令提供的“ c
”选项指示它创建档案 。 我喜欢在我运行的所有jar
命令中使用“ v
”(详细)和“ f
”(文件名)选项,以便输出是详细的(以帮助您了解正在发生的事情,并且它是正在发生的正确事情)因此,可以根据命令的输入提供适用的JAR / WAR / EAR文件名,而不是根据标准输入和标准输出来输入或输出。 在创建JAR文件的情况下,选项“ cvf”将创建具有指定名称( f
)的JAR文件( c
)并打印出有关此创建的详细输出( v
)。
下一个屏幕快照展示了jar cvf
的最简单用法。 我将当前目录更改为“ classes”目录,因此创建JAR就像运行jar cvf *
或jar cvf .
一样简单jar cvf .
并且当前目录中的所有文件以及所有子目录和子目录中的文件将包含在创建的JAR文件中。 下一个屏幕快照中演示了此过程。
如果我不想在运行jar
之前将当前目录显式更改为构建JAR的最合适的目录,则可以使用-C
选项指示jar
在其创建过程中隐式地执行此操作。 下一个屏幕快照对此进行了演示。
列出档案的内容
列出(或查看) JAR,WAR或EAR文件的内容可能是我使用jar
命令最常执行的功能。 为此,我通常使用选项“ t
”(列出存档的内容),“ v
”(详细)和“ f
”(在命令行上指定的文件名)。 下一个屏幕快照演示了如何运行jar tvf MyClasses.jar
来查看我生成的JAR文件的内容。
提取存档文件的内容
有时需要提取存档文件中包含的一个或多个文件,以处理或查看这些单个文件的内容。 这是通过jar
“ x
”(用于提取)选项完成的。 下一个屏幕快照演示了如何使用jar xvf MyClasses.jar
提取该JAR文件的所有内容。 请注意,原始的JAR文件保持不变,但现在也可以直接使用其内容。
我通常只需要查看或使用存档文件的一个或两个文件。 尽管我可以绝对地提取所有文件,如上一个示例所示,并且仅编辑需要编辑的文件,但是如果文件数量很少,我更喜欢仅提取需要的文件。 使用相同的jar xvf
命令可以轻松完成此操作。 通过指定完全限定的文件以在命令中的存档文件名之后显式提取,我可以指示
仅提取那些特定文件。 这是有优势的,因为我不会在目录中填入我不关心的文件,并且在完成后也不必担心清理太多。 下一个屏幕快照演示了运行情况
jar xvf MyClasses.jar dustin/examples/jar/GrandParent.class
仅提取jar xvf MyClasses.jar dustin/examples/jar/GrandParent.class
单个类定义,而不提取该JAR中的所有文件。
更新档案文件
先前的示例演示了如何为jar
命令提供“ c”来创建档案,“ t”来列出档案的内容,以及“ x”来提取档案的内容。 另一个通常执行的功能是更新现有档案的内容 ,这是通过jar
的“ u
”选项完成的。 下一个屏幕快照演示了如何在DOS中使用copy con命令创建一个名为tempfile.txt
的文本文件,然后使用jar uvf MyClasses.jar tempfile.txt
更新MyClasses.jar
并将tempfile.txt
添加到该JAR。
如果要更新现有存档中的文件,可以使用jar xvf
提取该文件,根据需要修改该文件,然后使用jar uvf
命令将其放回原始JAR中。 新文件将覆盖同名的现有文件。 下一个屏幕快照对此进行了模拟。
从存档文件中删除条目
在阅读jar手册页 , jar的Oracle工具描述或jar的Java Tutorials覆盖范围时,看不到从Java归档文件中删除条目的选项,这也许有些令人惊讶。 实现此目的的一种方法是提取JAR的内容,删除不再需要的文件,并从已删除这些文件的目录中重新创建JAR。 但是,一种更简单的方法是简单地利用基于ZIP的Java归档并使用基于ZIP的工具的删除功能。
下一个屏幕快照将演示使用的7-Zip(在Windows上)删除tempfile.txt
从MyClasses.jar
运行命令7z d MyClasses.jar tempfile.txt
。 请注意,使用zip -d MyClasses.jar tempfile.txt
可以在Linux中完成相同的操作。 其他ZIP支持工具也有自己的选择。
WAR和EAR文件
这篇文章中的所有示例都针对JAR文件,但是这些示例适用于WAR和EAR文件。 作为一个非常简单的示例,下一个屏幕快照演示了如何使用jar uvf
使用新的Web描述符更新WAR文件。 对于本例而言,涉及的实际文件的内容无关紧要。 需要注意的重要一点是,可以以与JAR文件完全相同的方式来操纵WAR文件。 这也适用于EAR文件。
其他
在本文中,我重点介绍了可从命令行对Java存档文件执行的“ CRUD”操作(创建/读取/更新/删除)和提取。 我通常将适用的“ CRUD”操作命令(“ c”,“ t”,“ u”)或提取命令(“ x”)与常用选项“ v”(详细)和“ f”(Java)结合使用在命令行上明确指定的存档文件名)。 jar
命令支持除这些操作以外的其他操作,例如“ M”(控制清单文件的创建)和“ 0”(控制压缩)。 我也没有演示使用“ i”为Java档案生成索引信息。
有关使用Java存档的其他资源
我之前引用了这些内容,但为方便起见在此进行了总结。
结论
jar
命令相对易于使用,在某些情况下可以是创建,查看和修改Java归档文件内容的最快方法。 熟悉此命令行工具可以使Java开发人员不时得到回报,尤其是在执行高度重复的任务或涉及脚本的任务时。 IDE和工具(特别是构建工具)在Java存档文件操作方面可以提供很多帮助,但是有时这些“开销”要比从命令行使用jar
时所需的开销大得多。
翻译自: https://www.javacodegeeks.com/2014/12/manipulating-jars-wars-and-ears-on-the-command-line.html
jar 、war、ear