java 溯本求源之基础(八)之 jar(下篇)

上篇中我们介绍了 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.class

这意味着 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

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

相关推荐
斯普信专业组2 分钟前
Tomcat全方位监控实施方案指南
java·tomcat
忆雾屿13 分钟前
云原生时代 Kafka 深度实践:06原理剖析与源码解读
java·后端·云原生·kafka
武昌库里写JAVA26 分钟前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
gaoliheng00634 分钟前
Redis看门狗机制
java·数据库·redis
我是唐青枫37 分钟前
.NET AOT 详解
java·服务器·.net
Su米苏1 小时前
Axios请求超时重发机制
java
本郡主是喵2 小时前
并发编程 - go版
java·服务器·开发语言
南风lof2 小时前
源码赏析:Java线程池中的那些细节
java·源码阅读
pengyu2 小时前
【Java设计原则与模式之系统化精讲:零】 | 编程世界的道与术(理论篇)
java·后端·设计模式