修改JAR文件并重新打包的两种方式

 更新时间:2026年04月20日 09:16:05   作者:蒙眼过河  
本文介绍了两种修改并重新打包JAR文件的方法:Java命令方式和Ant脚本方式,特别强调了对于SpringBoot可执行JAR包,重新打包时严禁使用压缩(必须使用存储模式),否则会导致启动失败,文中还提供了详细的核心避坑和最佳实践,确保修改后的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-INFBOOT-INForg 目录的层级关系。
数字签名如果原 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文件并重新打包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC中日期格式的转换

    SpringMVC中日期格式的转换

    本文主要介绍了SpringMVC中日期格式转换的相关知识:用来解决日期提交转换异常的问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • java中文分词之正向最大匹配法实例代码

    java中文分词之正向最大匹配法实例代码

    中文分词应用很广泛,网上也有很多开源项目,下面这篇文章主要给大家介绍了关于java中文分词之正向最大匹配法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • win10 64位 jdk1.8的方法教程详解

    win10 64位 jdk1.8的方法教程详解

    这篇文章主要介绍了win10 64位 jdk1.8的方法教程详解,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • java中FileOutputStream中文乱码问题解决办法

    java中FileOutputStream中文乱码问题解决办法

    这篇文章主要介绍了java中FileOutputStream中文乱码问题解决办法的相关资料,需要的朋友可以参考下
    2017-04-04
  • Spring Cloud Alibaba实现服务的无损下线功能(案例讲解)

    Spring Cloud Alibaba实现服务的无损下线功能(案例讲解)

    这篇文章主要介绍了Spring Cloud Alibaba实现服务的无损下线功能 ,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 初探Java内部类的使用

    初探Java内部类的使用

    Java内部类一般可以分为以下三种:成员内部类、静态内部类和匿名内部类。这篇文章主要带大家初探一下Java内部类的使用,感兴趣的可以了解一下
    2022-09-09
  • SpringBoot服务器端解决跨域问题

    SpringBoot服务器端解决跨域问题

    这篇文章主要介绍了SpringBoot服务器端解决跨域问题,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-11-11
  • IDEA 单元测试覆盖技巧分享

    IDEA 单元测试覆盖技巧分享

    这篇文章主要介绍了IDEA 单元测试覆盖技巧分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Nacos服务注册与发现原理解读

    Nacos服务注册与发现原理解读

    Nacos是阿里巴巴开源的微服务组件,支持服务注册、发现及配置管理,采用客户端心跳维护、服务端推送与长轮询同步,结合健康检查机制,实现高效可靠的微服务治理
    2025-08-08
  • Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

    Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

    本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的定义、作用范围、使用场景、实现步骤、执行顺序、常见问题及解决方案,感兴趣的朋友跟随小编一起看看吧
    2025-03-03

最新评论