1.java
2.jar
2.1 介绍
- JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包。(
也可以用war包. jar cvf aa.war)- 当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动生成。
- JAR包是由JDK安装目录\bin\jar.exe命令生成的,当我们安装好JDK,设置好path路径,就可以正常使用jar.exe命令,它会用lib\tool.jar工具包中的类。
jar命令格式:
jar {c t x u i }[ v f m n 0 P M e ][jar-file][manifest-file] [entry-point] [-C dir] files ...
其中{ctxu}这四个参数必须选选其一(互斥的参数)。[v f m e 0 M i ]是可选参数,文件名也是必须的。
-c创建一个jar包
-t显示jar中的内容列表
-x解压jar包
-u添加文件到jar包中
-i为指定的jar文件创建索引文件
-v生成详细的报造,并输出至标准设备
-f指定jar包的文件名
-m指定manifest.mf文件.(manifest.mf文件中可以对jar包及其中的内容作一些一设置)
-0产生jar包时不对其中的内容进行压缩处理
-P保留文件名中的前导‘/’(绝对路径)和‘…’(父目录)组件
-M不产生所有文件的清单文件(Manifest.mf)。这个参数与忽略掉-m参数的设置
-e为打包成可执行JAR文件的独立应用程序指定应用程序入口点
-C表示转到相应的目录下执行jar命令,相当于cd到那个目录,然后不带-C执行jar命令
2.2 使用
- 创建jar包 (
f放前面,不然不会停止)
jar cvf <输出的JAR文件名> [要打包的文件或目录...]jar
cvfhello.jar hello #创建hello.jar,存在则覆盖
jarcvfhello.jar -C ./jar hello #在当前目录生成hello.jar,选取内容为./jar/hello文件夹
说明:
cvf会自动生成一个基本的META-INF/MANIFEST.MF,内容类似:Manifest-Version: 1.0 Created-By: 1.8.0_241 (Oracle Corporation)不会包含任何自定义属性(如 Main-Class、Class-Path 等)。
使用-m指定自定义清单 才不会生成新的META-INF/MANIFEST.MF
- 解压jar包
jar
xvfhello.jar
- 查看jar包
jar
tvfhello.jar
- jar中添加文件
jar
uvfhello.jar aa.txt # 将aa.txt加入hello.jar
jaruvfhello.jar./jar/aa.txt#会添加到jar目录下 (在上层目录)
jaruvfhello.jar../jar/aa.txt#会添加到jar目录下 (在当前目录)
- 创建不压缩内容jar包
jar
cvfhello.jar *.class #利用当前目录中所有的.class文件生成一个不压缩jar包
- 创建带manifest.mf文件的jar包
jar
cvfmhello.jar manifest.mf hello #创建的jar包多了一个META-INF目录,META-INF止录下多了一个manifest.mf文件,至于manifest.mf的作用,后面会提到.
- 忽略manifest.mf文件
jar cvfM hello.jar hello #生成的jar包中不包括META-INF目录及manifest.mf文件
3. 查看,修改字节码文件
工具:
JClassLib、JavaBite、JByteMod
4. 问题处理
4.1 jar包 解压,压缩有manifest.mf变化了
使用-m参数,制定MAI当使用 -m 参数时,jar 命令后面的第一个文件名就是指定的清单文件(MANIFEST.MF)
jar cvfm <输出的JAR文件名> <指定的清单文件> [要打包的文件或目录...]
JAR 的特殊结构:
BOOT-INF/lib/ 下的 JAR 文件必须存储为 STORED(不压缩),否则 Spring Boot 的 Launcher 无法正确加载它们。0:不压缩(STORED 模式)。
jar cvfm0 <输出的JAR文件名> <指定的清单文件> [要打包的文件或目录...]
4.2 为什么MANIFEST.MF 启动类对war包没影响,jar包有影响
JAR 包和 WAR 包在 MANIFEST.MF 处理上的差异,主要源于它们的用途和规范不同。以下是具体原因分析:
- 核心区别:JAR 是通用包,WAR 是 Web 专用包
- JAR (Java Archive)
* 通用格式,可独立运行(如 java -jar)或作为库。
* MANIFEST.MF 直接影响功能(如 Main-Class 定义入口)。
* 重新打包时若丢失 Main-Class,会导致无法直接运行。- WAR (Web Application Archive)
* 专用于 Web 应用(部署到 Servlet 容器如 Tomcat)。
* 不依赖 MANIFEST.MF 运行,而是通过 web.xml 或注解定义入口。
* 容器(如 Tomcat)会忽略 MANIFEST.MF 中的 Main-Class,转而读取 WEB-INF/ 下的配置。
核心区别
| 特性 | JAR包 | WAR包 |
|---|---|---|
| 用途 | 通用Java包/可执行程序 | Web应用程序包 |
| 运行依赖 | 依赖MANIFEST.MF中的Main-Class | 依赖web.xml/Servlet注解 |
| 重要性 | 关键功能文件 | 辅助性元数据文件 |
4.3 jar包lib目录压缩模式
lib/ 目录下的 JAR 必须是非压缩(
STORED)模式,而其他 JAR 可以保持压缩(DEFLATED)模式
4.4 jar editor可以编辑单个lib目录下的jar包


被折叠的 条评论
为什么被折叠?



