如何修改 JAR 包中的源码

  • 前言
  • 一、准备工作
  • 二、将 JAR 当作 ZIP 打开并提取
  • 三、重写 Java 类
    • 方法 A:直接替换已编译的 `.class`
    • 方法 B:运行时类路径优先加载
  • 四、修改 MyBatis(或其他)XML 资源
  • 五、重新打包 JAR(命令行)
  • 六、验证改造


前言

在无法通过源码级插件或扩展机制实现深度定制时,可以直接对第三方 JAR 进行改造。本指南涵盖两大部分:

  1. 重写 Java 类

    • 方法 A:直接替换 .class

    • 方法 B:利用运行时类路径优先级加载自定义实现

  2. 修改资源文件(如 MyBatis XML)

  3. 重新打包 JAR

通过这三步,即可拥有一个包含自定义 Java 行为和调整过映射文件的完整 JAR。

一、准备工作

  • 工具

    • JDK(含 javacjar

    • ZIP 工具:7-Zip、WinRAR 或命令行 unzip/zip

  • 项目结构

    • 本地工作目录 workspace/

    • 原始 JAR:workspace/lib/original.jar

    • 输出目录:workspace/out/

二、将 JAR 当作 ZIP 打开并提取

  1. 打开归档

    • 在文件管理器右键 original.jar7-Zip → Open Archive
  2. 浏览与提取

    • 定位到:

      com/example/service/MyService.class  
      org/mybatis/mapping/EntityMapper.xml
      
    • 将它们分别“Extract”到 workspace/src_classes/workspace/src_resources/

此步仅用于获取原始文件样本与路径,后续改造可完全在本地完成。

三、重写 Java 类

方法 A:直接替换已编译的 .class

  1. 在本地创建相同包路径

    workspace/project/src/main/java/com/example/service/
    
  2. 编写或粘贴重写后的源码

    // MyService.java
    package com.example.service;public class MyService {@Overridepublic String process(String input) {// 自定义逻辑return "[Custom] " + input.toUpperCase();}
    }
    
  3. 编译生成 .class

    javac -d workspace/out/classes \workspace/project/src/main/java/com/example/service/MyService.java
    
  4. 用 7-Zip 覆盖原 JAR 中的 class

    • 打开 original.jar,拖入 workspace/out/classes/com/example/service/MyService.class

    • 确认替换

  5. 关闭归档,JAR 已含自定义 Java 实现

    原理:当 JVM 加载类时,直接从 JAR 内相对路径读取 .class,已覆盖文件会被优先使用。

方法 B:运行时类路径优先加载

  1. 直接将源码放入项目

    • 与上面同样的包路径及文件:src/main/java/com/example/service/MyService.java
  2. 确保运行时 classpath 顺序

    • 项目输出(含自定义类)需在第三方 JAR 之前
    • 例如命令行启动:
      java -cp target/classes:lib/original.jar com.example.Main
      
  3. JVM 加载优先使用target/classes 中的 class ,无需改动 JAR

    优点:无需修改 JAR,适用于开发迭代或测试时快速覆盖。

四、修改 MyBatis(或其他)XML 资源

MyBatis 映射文件通常以 .xml 形式嵌入 JAR,无法通过 Java 机制 Override,必须物理替换:

  1. 定位 XML

    • 在 7-Zip 中,打开路径:

      org/mybatis/mapping/EntityMapper.xml
      
  2. 提取并编辑

    • “Extract” 到 workspace/src_resources/org/mybatis/mapping/

    • 用编辑器修改 SQL、命名空间等,例如:

      <select id="findById" resultType="com.example.Entity">SELECT id, name, statusFROM CUSTOM_ENTITY_TABLEWHERE id = #{id}
      </select>
      
  3. 将修改后的 XML 覆盖回 JAR

    • 拖回 7-Zip 窗口,确认替换

    同理:任何 META-INF/application.properties、Spring XML 等资源都可如此替换。

五、重新打包 JAR(命令行)

若偏好脚本化,无需 GUI,可用 JDK 自带 jar 工具重建:

  1. 准备输出目录

    workspace/out/classes/        ← Java .class
    workspace/out/resources/      ← XML、配置文件
    
  2. 执行打包

    cd workspace/out
    jar cf modified.jar \-C classes . \-C resources .
    
  3. 检查内容

    jar tf modified.jar
    

确认 com/example/service/MyService.classorg/mybatis/mapping/EntityMapper.xml 均已更新。

六、验证改造

  1. 替换运行时库

    • 将原 lib/original.jar 换成 out/modified.jar
  2. 启动应用并测试

    • 调用被重写的方法,确认 Java 逻辑生效

    • 执行涉及 MyBatis 的操作,验证新 SQL 或映射是否正确


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/81965.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/81965.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/81965.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存算一体架构下的新型AI加速范式:从Samsung HBM-PIM看近内存计算趋势

引言&#xff1a;突破"内存墙"的物理革命 冯诺依曼架构的"存储-计算分离"设计正面临根本性挑战——在GPT-4等万亿参数模型中&#xff0c;数据搬运能耗已达计算本身的200倍。存算一体&#xff08;Processing-In-Memory, PIM&#xff09;技术通过‌在存储介…

蓝桥杯15届国赛 合法密码

问题描述 小蓝正在开发自己的 OJ 网站。他要求网站用户的密码必须符合以下条件&#xff1a; 长度大于等于 8 个字符&#xff0c;小于等于 16 个字符。必须包含至少 1 个数字字符和至少 1 个符号字符。 例如 **lanqiao2024!、-*/0601、8((>w<))8** 都是合法的密码。 而…

Jenkins忘记admin密码后的恢复步骤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 时间较长没有使用…

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C - 仿 RabbitMQ 实现消息队列&#xff08;1&#xff09;&#xff08;环境搭建&#xff09; 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…

简单面试提问

Nosql非关系型数据库&#xff1a; Mongodb&#xff1a;开源、json形式储存、c编写 Redis&#xff1a;key-value形式储存&#xff0c;储存在内存&#xff0c;c编写 关系型数据库&#xff1a; sqlite;&#xff1a;轻量型、0配置、磁盘存储、支持多种语言 mysql&#xff1a;开源…

油气地震资料信号处理中的NMO(正常时差校正)

油气地震资料信号处理中的NMO&#xff08;正常时差校正&#xff09;介绍与应用 NMO基本概念 **正常时差校正&#xff08;Normal Moveout Correction&#xff0c;NMO&#xff09;**是地震资料处理中的一项关键技术&#xff0c;主要用于消除由于炮检距&#xff08;source-recei…

深度解析:从 GPT-4o“谄媚”到 Deepseek“物理腔”,透视大模型行为模式的底层逻辑与挑战

深度解析&#xff1a;从 GPT-4o“谄媚”到 AI“物理腔”&#xff0c;透视大模型行为模式的底层逻辑与挑战 标签&#xff1a;人工智能, GPT-4o, 大语言模型, AI伦理, 人机交互, 技术思考 大家好&#xff01;最近AI圈最火的“瓜”之一&#xff0c;莫过于OpenAI的GPT-4o模型在一…

Java引用RabbitMQ快速入门

这里写目录 Java发送消息给MQ消费者接收消息实现一个队列绑定多个消费者消息推送限制 Fanout交换机路由的作用Direct交换机使用案例 Java发送消息给MQ public void testSendMessage() throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory new Conn…

从读写分离到分布式服务:系统架构演进十阶段深度解析

第一阶段到第四阶段&#xff1a;架构进化四阶段&#xff1a;探索单体到集群的高可用性能优化之道-CSDN博客https://blog.csdn.net/pinbodeshaonian/article/details/147464084?spm1001.2014.3001.5502 以下是对从第五阶段到第十阶段详细的解释&#xff1a; 第五阶段&#xf…

Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS

目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合&#xff0c;本文为反射型和存储型XSS漏洞关卡的渗透部分&#xff0c;通过对XSS关卡源码的代码审计找到漏…

Prometheus的安装部署

目录 一、概述 二、Prometheus的安装 1、二进制方式 1.1、下载系统安装包​编辑 1.2、解压 1.3、创建数据目录&#xff0c;服务运行用户 1.4、设置为系统服务&#xff08;创建服务运行脚本&#xff09; 1.5、启动服务&#xff0c;并通过浏览器访问验证 2、容器方式 2…

Jupyter Notebook为什么适合数据分析?

Jupyter Notebook 是一款超实用的 Web 应用程序&#xff0c;在数据科学、编程等诸多领域都发挥着重要作用。它最大的特点就是能让大家轻松创建和共享文学化程序文档。这里说的文学化程序文档&#xff0c;简单来讲&#xff0c;就是把代码、解释说明、数学公式以及数据可视化结果…

Python清空Word段落样式的方法

在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档&#xff0c;包括清空段落样式。以下是几种清空段落样式的方法&#xff1a; 方法一&#xff1a;直接设置段落样式为"Normal" from docx import Documentdoc Document(your_document.docx) # 打…

macOS 上是否有类似 WinRAR 的压缩软件?

对于习惯使用 Windows 的用户来说&#xff0c;WinRAR 是经典的压缩/解压工具&#xff0c;但 macOS 系统原生并不支持 RAR 格式的解压&#xff0c;更无法直接使用 WinRAR。不过&#xff0c;macOS 平台上有许多功能相似甚至更强大的替代工具&#xff0c;以下是一些推荐&#xff1…

WebRtc09:网络基础P2P/STUN/TURN/ICE

网络传输基本知识 NATSTUN&#xff08;Session Traversal Utilities for NAT&#xff09;TURNICE NAT 产生的原因 IPV4地址不够出于网络安全的原因 NAT种类 完全锥型NAT(Full Cone NAT)地址限制型NAT(Address Restricted Cone NAT)端口限制型NAT(Port Restricted Cone NAT…

如何添加或删除极狐GitLab 项目成员?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色&#xff0c;这决定了他们在项目中可以…

用单目相机和apriltag二维码aruco实现单目定位

目录 一、核心流程与代码框架 1. ‌环境准备‌ 2. ‌ArUco定位实现 3. ‌AprilTag定位实现&#xff08;需额外安装Apriltag库&#xff09; 二、关键优化点 1‌.亚像素角点优化 2‌ 多标签联合定位 三、性能指标&#xff08;实测&#xff09; 四、常见问题 ‌检测失败…

tinyrenderer笔记(透视矫正)

tinyrenderer个人代码仓库&#xff1a;tinyrenderer个人练习代码 引言 还要从上一节知识说起&#xff0c;在上一节中我为了调试代码&#xff0c;换了一个很简单的正方形 obj 模型&#xff0c;配上纹理贴图与法线贴图进行渲染&#xff0c;得了下面的结果&#xff1a; what&…

MySQL的内置函数与复杂查询

目录 前言 一、聚合函数 1.1日期函数 1.2字符串函数 1.3数学函数 1.4其它函数 二、关键字周边 2.1关键字的生效顺序 2.2数据源 2.3可以使用聚合函数的关键字 前言 在前面几篇文章中&#xff0c;讲解了有关MySQL数据库、数据库表的创建、数据库表的数据操作等等。本文我…

见多识广4:Buffer与Cache,神经网络加速器的Buffer

目录 前言传统意义上的Buffer与Cache一言以蔽之定义与主要功能BufferCache 数据存储策略二者对比 神经网络加速器的bufferInput BufferWeight BufferOutput Buffer与传统buffer的核心区别总结 前言 知识主要由Qwen和Kimi提供&#xff0c;我主要做笔记。 参考文献&#xff1a; …