上篇中我们介绍了 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 目录中包含 bar1bar2 文件,my.jar 文件将包含以下内容:

% jar tf my.jar META-INF/ META-INF/MANIFEST.MF bar1 bar2 Xyz.classjava 溯本求源之基础(八)之 jar(下篇)-LMLPHP

        这意味着 bar1bar2Xyz.class 文件已被添加到 my.jar 中,且它们在 JAR 文件中的路径不会包含原始的目录结构(即没有 classesbin 目录)。

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

        好了 这个命令本次就介绍到这里了,到此为止 我们已经介绍了四个命令了,但是还是需要我们记住,不要被技术限制住,不要因为技术而技术,工具都是为了方便我们提高我们的效率。另外笔者想说,为什么其他作者都是介绍一些高大上的东西,而在我这里都是一些我们不去太关注的细节,主要还是这些确实我们不一定用上,但是我希望大家在被某些问题困住的时候,能够在这里提供一些思路,最后过段时间也会更新其他东西,像是一些常见的东西我这边都会更新,为的就是帮助刚入行的人能够灵活的应对各种困难。

03-30 06:28