对原jar包解压后修改原class文件后重新打包为jar

文章目录

    • 背景
    • 三种修改方式
      • 1.POM中移除原jar中依赖的历史版本
      • 2.原jar它不使用pom依赖而是直接放在源码中再编译
      • 使用JarEditor 插件对源码进行修改(推荐)
      • 使用java-decompiler反编译后修改源码覆盖原class(不好用-不推荐直接跳过)
      • 提醒
    • 参考资料-推荐阅读拓展

背景

在新代码中调用的高版本方法但是依赖的历史版本用的低版本,存在调用方法不存在,有可能你编译时通过,但是调用时发现JVM依赖的版本是旧版本,导致调用的新版方法发生异常。例如我下面的这个异常,那么我们就需要调和这种依赖冲突。

java.lang.NoSuchMethodError: 'java.lang.reflect.Field[] org.apache.commons.lang3.reflect.FieldUtils.getAllFields(java.lang.Class)
'
xxxx.core.domain.SplitFields(25)

这种情况通常是我们依赖第三方jar,或者其他团队提供的jar,自身没有源码,或者自己的历史版本源码实在不想动了。

或者我们希望在现有的jar中添加自己的方法,或者修改现有jar中的依赖启动项目,比如历史jar依赖的当前运行环境中的resource中的配置文件,或者特定的文件路径比如d//config,这种如果在centos环境,或者在docer环境根本就无法加载到这些文件路径。因此需要我们手动修改源文件,但是有没有源码的情况下的不得已而为之。

三种修改方式

1.POM中移除原jar中依赖的历史版本

如果原jar使用的pom.xml依赖我们可以使用exclusions排除该依赖,当然也就不需要我们这里提到的修改原jar了

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>com.netflix.ribbon</groupId><artifactId>ribbon</artifactId></exclusion></exclusions></dependency>

2.原jar它不使用pom依赖而是直接放在源码中再编译

这种情况使用上面的排除是没办法的,如下图,org.apache.commons.lang3的源码它给直接合到它的项目中了,而不是使用的依赖pom加载,这种方式,你只能通过本文的方式手工清理这种强依赖。

在这里插入图片描述
方法如下:
使用rar解压工具打开文件,找到对应的org.apache.commons.lang3,直接删除即可
在这里插入图片描述

切换到META-INF\maven下找到
找到对应的commons-lang3直接删除
在这里插入图片描述
如此重新添加到仓库中或者放入项目的lib下面即可解除旧版本的依赖

使用JarEditor 插件对源码进行修改(推荐)

IDE安装完 JarEditor 后,右键点击项目中的 .class 文件,在反编译界面可以切换到 JarEditor 的 tab 页面,方便对 JAR 文件进行编辑。

对于外部 JAR 文件,可以通过 File -> Project Structure -> Libraries -> Add Library 来添加外部 JAR,并在项目视图中对其进行反编译和编辑操作,
如下图我对我遇到的依赖jar中的旧版本代码进行修改增加新版本中新的方法如下,然后保存即可覆盖源jar中的文件

target选择JDK版本8即可;

保存后我们关闭编辑页面,重新双击打开jar中的FieldUtils我们可以看到它已经有我们上面添加的方法代码块了。

在这里插入图片描述

使用java-decompiler反编译后修改源码覆盖原class(不好用-不推荐直接跳过)

以上都不行那就只能修改原class了,比如写死的加载路径,或者已经无法再外面满足的配置文件地址等等。

jar解压jar拿到源class先看通用命令

#解压当前文件到当前目录jar -xvf .\MQSDK1.6.1.jar#重新压缩当前路径下的所有文件为 MQSDK1.6.1.jarjar cvfM0 MQSDK1.6.1.jar ./*

比如这里我们看到了,需要修改这个代码rg.git.gr.modules.clm.controller.company.CompanyApplyController

首先创建或者直接使用现有的项目,在src下面新建一个同名同目录的类文件org.git.gr.modules.clm.controller.company.CompanyApplyController目的是编译后后它的包路径和文件名方法名依然和原来一样,不会造成代码冲突和异常
在这里插入图片描述

然后使用java-decompiler反编译工具找到原jar解压路径种对应类,复制里面的内容信息到自己新增的类中,修改新类的源码后重新编译,使用编译后的class文件覆盖原解压的jar中的对应文件。

提醒

以上修改原jar的方式,如果使用的pom加载记得都要修改版本号后提交到仓库中,不然下次拉取可能还是原来的版本内容。

如果使用 外部加载lib的方式则保留好修改后的jar资源就可以了。

参考资料-推荐阅读拓展

告别繁琐反编译:IDEA中轻松反编译与修改Jar包
https://datamining.blog.csdn.net/article/details/142311328

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

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

相关文章

PyQt6+pyqtgraph折线图绘制显示

1、实现效果 2、环境&#xff1a; 确认已经安装pyqtgraph的模块&#xff0c;如果没有安装&#xff0c;使用命令安装&#xff1a; pip install pyqtgraph 3、代码实现&#xff1a; 绘制折线函数&#xff1a; import sys import random from PySide6.QtWidgets import QAppl…

Altium Designer学习笔记 1-5 工程创建_元件库创建

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 目录 1、工程组成 2、AD工程创建 3、元件库的阻容模型创建 4、IC类的元件库模型创建 5、排针类的元件库模型创建 1、工程组成 主要包括原理图库----原理图----PCB库----PCB 2、AD工程创建 新建工程项目 …

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder&#xff08;视频重复查找器&#xff09;是一款开源的跨平台视频&#xff08;以及图像&#xff09;去重软件&#xff0c;通过对比文件内容和特征&#xff0c;快速识别出重复的视频和图像文件&#xff0c;即使是被压缩裁剪过、…

力扣力扣力:860柠檬水找零

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 需要注意的是&#xff0c;我们一开始是没有任何钱的&#xff0c;也就是说我们需要拿着顾客的钱去找零。如果第一位顾客上来就是要找零那么我们无法完成&#xff0c;只能返回false。 分析&#xff1a; 上来我们先不分…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

装饰器---python

一、柯里化 概念&#xff1a;将原来接受两个参数的函数变成新的接受一个参数的函数过程&#xff0c;新的函数返回一个以原有第二个参数为参数的函数 例如&#xff1a; 例一 原函数是add(x,y),柯里化的目标是add(x)(y),如何实现呢&#xff1f; 相当于嵌套函数&#xff0c;有闭…

Spring AI 框架使用的核心概念

一、模型&#xff08;Model&#xff09; AI 模型是旨在处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式和见解&#xff0c;这些模型可以做出预测、文本、图像或其他输出&#xff0c;从而增强各个行业的各种应用。 AI 模型有很多种&…

知识见闻 - 数学: 均方根 Root Mean Square

What is Root Mean Square (RMS)? 在统计学上&#xff0c;均方根&#xff08;RMS&#xff09;是均方的平方根&#xff0c;而均方是一组数值的平方的算术平均数。均方根也称为二次均值&#xff0c;是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…

基于Spring AI alibaba组件AI问答功能开发示例

基于Spring AI alibaba组件AI问答功能开发示例 功能效果图&#xff1a; http://localhost:9999/ai/test http://localhost:9999/ai/chat?inputai 配置 application.yaml 指定 API-KEY&#xff08;可通过访问阿里云百炼模型服务平台获取&#xff0c;有免费额度可用。&#x…

Linux - 线程基础

文章目录 1.什么是线程2.线程vs进程3.线程调度4.线程控制4.1 POSIX线程库4.2创建线程4.3线程终止4.4线程等待4.5线程分离 5、线程封装 1.什么是线程 在Linux操作系统中&#xff0c;线程是进程内部的一个执行流。在Linux操作系统下&#xff0c;执行流统称为轻量级进程&#xff0…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

PTA编程题:N个数求和

问题描述 思路分析 问题分解 输入处理&#xff1a;将分数拆解为分子和分母&#xff0c;存储并处理。 分数相加规则&#xff1a; 即分子相加、分母相乘。 结果化简&#xff1a;求分数的最大公因数&#xff08;GCD&#xff09;&#xff0c;将其约分至最简形式。 带分数处理&…

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…

RK3568平台(中断篇)ARM中断流程

一.ARM 处理器程序运行的过程 ARM芯片属于精简指令集计算机 (RISC: Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 ③ 使用RISC指令的CPU复杂度小一点,易于设计 比如对于 a=a+b 这…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…

推荐一款专业电脑护眼工具:CareUEyes Pro

CareUEyes Pro是一款非常好用的专业电脑护眼工具&#xff0c;软件小巧&#xff0c;界面简单&#xff0c;它可以自动过滤电脑屏幕的蓝光&#xff0c;让屏幕显示更加的不伤眼&#xff0c;更加舒适&#xff0c;有效保护你的眼睛&#xff0c;可以自定义调节屏幕的色调&#xff0c;从…

Element UI 组件库详解【Vue】

文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站&#xff0c;element.eleme.cn El…

相机触发模式

参考自&#xff1a;相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式&#xff1b;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…

脚手架vue-cli,webpack模板

先安装node.js&#xff0c;它是服务器端&#xff0c;用于给页面提供服务。前端学习不需要会node.js&#xff0c;只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具&#xff0c;作用是进行包管理&#xff0c;npm是node.js的包管理器。 接着安装脚手架&#xff…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…