上篇中我们介绍了 Java 类加载顺序、JAR 命令的使用以及 MANIFEST.MF 文件的作用。Java 类加载顺序包括 Bootstrap classes、Extension classes 和 Class Path。JAR 命令是一个归档和压缩工具,用于打包 Java 应用程序。MANIFEST.MF 文件存储打包文件的元信息,如主类、版本号和依赖路径。了解这些知识点对于 Java 开发和应用程序打包至关重要。本篇主要介绍jar命令的使用,以及一些注意事项。
1.jar的自定义参数
1.1 -f
这个参数很简单,就是指定文件名称的
1.2 -m
参数主要是设置manifest.mf的值的,对文件中的值走新增或者更新。
1.3 -M
在打包或者更新的时候指定不创建manifest.mf。
1.4 -n
在创建(c)一个JAR文件时,该选项将对归档文件进行规范化,使其内容不受pack200(1)命令的打包和解包操作的影响。如果没有这种规范化,已签名JAR的签名可能会失效。
1.5 -v
生成标准输出的详细输出
1.6 -0 这个是数字0
创建或者更新jar的时候不使用zip压缩
1.7 -C
这个 jar
命令用于更新(u
)一个现有的 JAR 文件 my.jar
,并添加或更新其中的一些文件。
-C
选项用于在添加文件到 JAR 文件之前临时改变当前工作目录。这对于在不创建与目录结构相对应的额外层次结构的情况下,将特定目录中的文件添加到 JAR 文件中非常有用。
具体来说:
-
jar uf my.jar -C classes Bar.class
:这个命令会临时切换到classes
目录,然后将Bar.class
文件添加到my.jar
中。添加完成后,会切换回原来的工作目录。 -
jar uf my.jar -C classes . -C bin Xyz.class
:这个命令会执行以下操作:-
首先,临时切换到
classes
目录,然后将该目录中的所有文件(由.
表示)添加到my.jar
中,但不会在 JAR 文件中创建classes
目录。 -
然后,切换回原来的工作目录。
-
接着,临时切换到
bin
目录,然后将Xyz.class
文件添加到my.jar
中。
-
最终,如果 classes
目录中包含 bar1
和 bar2
文件,my.jar
文件将包含以下内容:
% jar tf my.jar META-INF/ META-INF/MANIFEST.MF bar1 bar2 Xyz.class
这意味着 bar1
、bar2
和 Xyz.class
文件已被添加到 my.jar
中,且它们在 JAR 文件中的路径不会包含原始的目录结构(即没有 classes
或 bin
目录)。
1.8 -J*option*
设置指定的JVM选项,以便在JRE运行JAR文件时使用,例如,-J-Xms48m将启动内存设置为48mb。
2.Operands
这里是针对上篇中的使用方法的补充。
2.1 file
在创建(c)或更新(u)一个JAR文件时,文件操作数定义了应该添加到存档中的文件或目录的路径和名称。在提取(x)或列出JAR文件的内容(t)时,文件操作数定义要提取或列出的文件的路径和名称。必须指定至少一个有效的文件或目录。用空格分隔多个文件操作数。如果使用了入口点、jarfile或manifest操作数,则必须在它们之后指定文件操作数。
2.2 entrypoint
在创建(c)或更新(u) JAR文件时,入口点操作数定义了类的名称,该类应该作为绑定到可执行JAR文件中的独立Java应用程序的入口点。如果存在e选项,则必须指定入口点操作数。
2.3 jarfile
定义要创建(c),更新(u),提取(x)或查看(t)的文件的名称。如果存在f选项,则必须指定jarfile操作数。省略f选项和jarfile操作数将指示jar命令从标准输入(对于x和t)接受jar文件名,或者将jar文件发送到标准输出(对于c和u)。
当索引(i)一个JAR文件时,指定不带f选项的jarfile操作数。
2.4 manifest
当创建(c)或更新(u)一个JAR文件时,manifest操作数用manifest中包含的属性的名称和值定义预先存在的manifest文件。JAR文件中的MF。如果存在f选项,则必须指定清单操作数。
2.5 @arg-file
为了缩短或简化jar命令,我们可以在单独的文本文件中指定参数,并将其传递给jar命令,并使用@作为前缀。当jar命令遇到以@符号开头的参数时,它将该文件的内容扩展到参数列表中。
参数文件可以包含jar命令的选项和参数(-J选项除外,因为它们被传递给启动器,而启动器不支持参数文件)。文件中的参数可以用空格或换行符分隔。参数文件中的文件名相对于运行jar命令的当前目录,而不是相对于参数文件的位置。通配符(如星号(*))可能会被操作系统shell展开,但不会被展开。
下面的示例展示了如何创建一个类。用find命令从当前目录输出的文件名列出文件:
find .-name '*.class' -print > classes.list 然后可以执行jar命令并传递类。使用@arg-file语法将文件列表到它:
Jar cf my.jar @classes.list 参数文件可以用路径指定,但参数文件中任何具有相对路径的文件名都是相对于jar命令的当前工作目录的,而不是相对于传入的路径,例如:
jar @dir / classes.list
好了 这个命令本次就介绍到这里了,到此为止 我们已经介绍了四个命令了,但是还是需要我们记住,不要被技术限制住,不要因为技术而技术,工具都是为了方便我们提高我们的效率。另外笔者想说,为什么其他作者都是介绍一些高大上的东西,而在我这里都是一些我们不去太关注的细节,主要还是这些确实我们不一定用上,但是我希望大家在被某些问题困住的时候,能够在这里提供一些思路,最后过段时间也会更新其他东西,像是一些常见的东西我这边都会更新,为的就是帮助刚入行的人能够灵活的应对各种困难。