Java使用命令行操作JAR、WAR和EAR文件

jopen 9年前

尽管有Java IDE和大量的图形工具能是你更容易地去查看和处理Java归档文件(JAR,WAR,和EAR)。但有时候我想使用jar的命令行命令去完成这些操作。 当我不得不做些重复的任务或者这些任务只是脚本的一部分时,使用命令行命令特别适合。在这篇文章里,我着重使用jar命令去创建,查看和处理Java归档 文件。

这篇文章主要使用JAR文件作为例子,但这些我展示的命令同样适用于.war和.ear文件。我们需要记住,JAR格式是基于ZIP格式的,所以很多处理ZIP文件的工具都适用于JAR,WAR,和EAR文件。同样需要记住的是jar选项类似于tar的选项。

在我的例子里,我打算去用jar归档和处理一些.class文件。下面的屏幕快照展示了编译一些java源代码文件(.Java文件) 为.class文件。这些文件的实际源码和这次讨论的内容关系不大,所以不在这展示了。我已经在这篇文章里展示了不用IDE直接使用命令行工具来编译这些 文件。

准备一些文件在jar这个例子里使用。

Java使用命令行操作JAR、WAR和EAR文件

下一张屏幕快照展示了我的.class文件已经被编译了 并等待着被打包。

Java使用命令行操作JAR、WAR和EAR文件

创建一个JAR文件

jar命令的“c”选项用来创建一个归档。在我运行的所有jar命令中,我喜欢使用“v”(verbose)和“f”(filename)选项。目 的是输出更多的信息(帮助看到事情的经过和一些正确的过程)和作为命令的一部分提供适当的JAR/WAR/EAR文件名而不是在标准输入输出里提供。在创 建一个JAR文件时,使用“cvf”选项会创建一个指定名称(f)的JAR文件并打印出详细情况,不过是创建成功。

下一个屏幕快照展示了一个使用jar cvf的简单例子。我进把我的目录切换到“classes”目录下,目的是使创建一个JAR跟运行jar cvf或者 jar cvf一样简单。所有在当前目录下的文件和子目录下的文件都会被打包为JAR文件。这个过程在下个屏幕快照展示。

Java使用命令行操作JAR、WAR和EAR文件

如果我不想在运行jar命令时明确地切换我的当前目录到最合适的目录,我可以使用-c选项指示jar命令明确地去做到上面的效果。

Java使用命令行操作JAR、WAR和EAR文件

列出归档的内容

列出(或者查看)一个JAR,WAR,或者EAR文件的内容可能是我最想使用的jar命令功能。我通常使用选项“t”(列出归档内容),“v” (verbose)和“f”(在命令行指定文件名)来列出文件内容。下一个屏幕快照展示了运行命令 jar tvf MyClasses.jar去查看我生成的JAR文件的内容。

Java使用命令行操作JAR、WAR和EAR文件

提取归档文件的内容

有时候想在一个归档文件里提取出一个或者多个文件来使用或者单独查看这些文件的内容。使用jar命令的“x”(用来提取)选项就可以做到。下一个屏 幕快照展示了使用命令 jar xvf MyClasses.jar 去提出JAR文件的所有内容。注意,原始的JAR文件原封不动,但是,现在它的内容全都可以直接获取到。

Java使用命令行操作JAR、WAR和EAR文件

我有时仅仅需要去查看获取使用归档文件中的一个或者两个文件。尽管我可以明确地把它们全都提取出来编辑我需要编辑的文件,就像在上面那个例子展示的 一样。但是我想仅仅去提取我需要的少量文件。使用命令jar xvf命令就可以轻松做到。通过在文件名后指定特定的权限定名,我可以仅提取出我指定的文件。这有一个好处:我不用被我不需要的文件占满了我的目录并且在 我完事后不需要费心去清理无用文件。下一个屏幕快照展示了运行命令jar xvf MyClasses.jar dustin/examples/jar/GrandParent.class去提取一个单一的文件,而不是提取全部文件。

Java使用命令行操作JAR、WAR和EAR文件

更新归档文件

之前的例子已经展示了提供“c”选项给jar命令去创建了一个归档,提供“t”选项列出归档内容,和提供“x”选项去提取一个归档内容。另一个经常 使用的功能是更新一个存在的归档内容,这使用jar的“u”选项来完成。下一个屏幕快照展示了创建一个叫tempfile.txt的文本文件(在DOS里 使用copy con 命令)然后使用jar uvf MyClasses.jar tempfile.txt去更新MyClass.jar并把tempfile.txt添加到JAR里

Java使用命令行操作JAR、WAR和EAR文件

如果你想在一个已存在的归档里更新一个文件,我可以使用jar xvf命令来提取出那个文件,然后按照你的意图修改它,最后使用jar uvf命令把它放回原始的JAR里。新的文件会把里面已存在的同名文件覆盖掉。这个实现在下一个屏幕快照里有。

Java使用命令行操作JAR、WAR和EAR文件

从归档文件里删除数据

当你阅读jar帮助手册,Oracle jar工具描述,或者Java教程中的jar部分时, 看到从一个Java归档文件里删除数据而不使用选项,你会感到惊讶。实现这种功能的一种方式是去提取出一个JAR文件的内容,删除不要的文件,使用删除文 件后剩下的文件去重新创建一个JAR包。但是有一个更简单的方法就是简单地利用Java归档格式基于ZIP的优势并使用ZIP工具的删除功能。

下一个屏幕快照展示了使用7-ZIP(在Window下)通过 7z d MyClasses.jar tempfile.txt命令从MyClass.jar删除tempfile.txt。注意,同样的事情在Linux可以使用zip -d MyClasses.jar tempfile.txt命令来完成。其他的ZIP支持工具用它们自己的选项。

Java使用命令行操作JAR、WAR和EAR文件

WAR和EAR文件

在这篇文章里的所有例子都是针对JAR文件,但这些例子是处理WAR和EAR文件的。z作为一个最简单的例子,下一个屏幕快照展示了使用命令jar uvf去更新一个新的web描述到WAR文件。文件的实际内容对这个例子的影响不大。重点是明白这:一个WAR文件可以像处理JAR文件一样被操作。这同 样适用于EAR文件。

Java使用命令行操作JAR、WAR和EAR文件

其他的jar的操作和选项

在这篇文章里,我侧重于“CRUD”操作(创建/读取/更新/删除)和一些能够从命令行提出Java归档的功能。我通常使用适当的“CRUD”操作 命令(“c”,“t”,“u”)或者提取命令(“x”)和“v”(verbose)还有“f”(在命令行指定Java归档文件名)命令选项一起使用。 jar命令除了支持这些操作外还有“M”(控制Mainfest文件创建)和“o”(控制压缩)命令。我还没展示使用“i”命令为Java归档生成索引信 息。

处理Java归档文件的其额外资源

下面是我之前引用的一些资料,为了方便,我总结在这里。

总结

jar命令时相对易用的,并能够快速的创建、查看和修改Java归档文件内容。熟悉这些命令行工具能为Java开发者节省时间,尤其是在进行频繁的 重复任务或者脚本任务时。IDE和工具(特别是创建工具)对操作Java归档文件很有帮助,但有时使用它们比使用jar命令行的花销更大。

来源:ImportNew - 进林