修改JAR文件并重新打包的两种方式
本文介绍两种修改 JAR 包内文件(如配置文件或 Class 文件)后重新打包的方式:Java 命令方式 与 Ant 脚本方式。
核心警告
对于 Spring Boot 的可执行 JAR 包,重新打包时严禁使用压缩(必须使用存储模式),否则会导致 ClassNotFoundException 或启动失败。
一、Java 命令方式 (通用/快速)
适用于临时修改或没有构建工具的环境。
1. 解压 JAR 文件
# -x: 解压, -f: 指定文件, -v: 显示过程(可选) jar -xf your-file.jar
2. 修改文件
在解压后的目录中,按需编辑文件(例如修改 BOOT-INF/classes/application.yml 或替换 .class 文件)。
3. 重新打包 (关键步骤)
# 注意:必须包含 -0 参数(存储模式,不压缩) jar -cvfm0 new-package.jar META-INF/MANIFEST.MF ./
参数详解:
-c: 创建新的归档文件。-v: 生成详细输出。-f: 指定归档文件名。-m: 包含清单文件META-INF/MANIFEST.MF(保留 Main-Class 等配置)。-0: 存储模式(不压缩)。这对于 Spring Boot 的嵌套 JAR 结构至关重要。
二、使用 Ant 脚本方式 (自动化/批处理)
适用于需要频繁修改或集成到旧版构建流程中的场景。
1.build.xml配置示例
<?xml version="1.0" encoding="UTF-8"?>
<project default="package" name="JarPatcher">
<description>
Spring Boot JAR 包热修复/修改工具
</description>
<!-- 1. 属性定义 -->
<property name="class.dir" location="./unpacked_classes"
description="解压后的临时目录"/>
<property name="newjar.name" location="fixed-app.jar"
description="生成的新 JAR 名称"/>
<property name="sourcejar.name" location="original-app.jar"
description="原始 JAR 路径"/>
<!-- 2. 初始化:清理并创建目录 -->
<target name="init">
<delete dir="${class.dir}" />
<mkdir dir="${class.dir}" />
</target>
<!-- 3. 解压:将原始 JAR 解压 -->
<target name="unjar" depends="init">
<unjar dest="${class.dir}" src="${sourcejar.name}">
</unjar>
<echo message="JAR 解压完成,请在此步骤后修改 ${class.dir} 中的文件。"/>
</target>
<!-- 4. 打包:重新打包 (注意 compress="false") -->
<target name="package" depends="unjar">
<jar destfile="${newjar.name}"
basedir="${class.dir}"
compress="false"
manifest="${class.dir}/META-INF/MANIFEST.MF">
</jar>
<echo message="新 JAR 生成成功: ${newjar.name}"/>
</target>
</project>2. 执行流程
# 第一步:解压 (依赖 init 和 unjar) ant unjar # [手动操作] 此时进入 unpacked_classes 目录修改文件 # 第二步:重新打包 ant package
核心避坑与最佳实践
为了确保你的 JAR 包修改后能正常运行,请务必关注以下几点:
| 关注点 | 说明 |
|---|---|
| 压缩级别 | Spring Boot 的 BOOT-INF/lib 下的依赖包必须保持 STORED(不压缩)状态,否则类加载器无法正确读取。 |
| 目录结构 | 严禁改变 META-INF、BOOT-INF 和 org 目录的层级关系。 |
| 数字签名 | 如果原 JAR 包有数字签名(META-INF/*.SF, *.RSA),修改内容后会导致签名失效。生产环境需重新签名,测试环境可删除签名文件。 |
| 清单文件 | 确保 MANIFEST.MF 中的 Main-Class 指向正确(Spring Boot 通常是 org.springframework.boot.loader.JarLauncher)。 |
验证命令:
打包完成后,建议先检查内容结构:
jar -tf new-package.jar | head -n 20
到此这篇关于修改JAR文件并重新打包的两种方式的文章就介绍到这了,更多相关修改JAR文件并重新打包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java反射通过Getter方法获取对象VO的属性值过程解析
这篇文章主要介绍了Java反射通过Getter方法获取对象VO的属性值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-02-02
Mybatis-config.xml中映射Mapper.xml文件遇到的错误及解决
这篇文章主要介绍了Mybatis-config.xml中映射Mapper.xml文件遇到的错误及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06
Java String字符串和Unicode字符相互转换代码详解
这篇文章主要介绍了Java String字符串和Unicode字符相互转换代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-05-05


最新评论