当前位置: 首页 > article >正文

Spring Boot Jar包修改配置文件和Class中硬编码IP的完整指南

前言在实际开发中我们有时会遇到这样的情况从第三方或历史版本中拿到一个 Spring Boot 打好的jar包但里面某个服务的 IP 地址是写死的无论是在application.yml还是直接在 Java 代码中作为字符串常量。由于无法获取源码或重新编译我们需要一种直接修改 jar 包的方法来替换 IP。本文将以一个真实场景为例详细介绍如何不借助源码直接修改 Spring Boot fat jar 中的application.yml配置文件和.class字节码中的硬编码 IP并重新打包成可运行的 jar。问题背景有一个 Spring Boot 项目编译后的collector.jar内部包含BOOT-INF/classes/application.yml—— 配置文件中写死了旧 IP192.168.1.100BOOT-INF/classes/com/xcr/socket/CollectorApplication.class—— 字节码中硬编码了 IPxxx.175.167.44现在需要将这两处 IP 都改为新的10.0.0.5并且保证修改后的 jar 能正常启动。解决思路类型修改方法工具配置文件application.yml文本替换文本编辑器 / PowerShell.class中的硬编码字符串字节码修改替换常量池Javassist为什么不用反编译再重新编译因为反编译后的代码可能不完整且重新编译需要完整的依赖和环境很容易失败。直接操作字节码更安全可靠。环境准备JDK 8本文以 JDK 8 为例下载 Javassisthttps://repo1.maven.org/maven2/org/javassist/javassist/3.29.2-GA/javassist-3.29.2-GA.jar将原 jar 包例如collector.jar和javassist.jar放在同一个工作目录下操作步骤1. 解压 jar 包jar xf collector.jar解压后会出现BOOT-INF和META-INF等目录。BOOT-INF/classes下就是项目的 class 文件和配置文件。2. 修改 application.yml直接用文本编辑器如 VS Code, Notepad打开BOOT-INF/classes/application.yml将其中所有的192.168.1.100替换为10.0.0.5保存。3. 修改 CollectorApplication.class 中的硬编码 IP这里不使用反编译而是直接用Javassist操作字节码。核心原理找到所有ldc指令加载字符串常量检查其指向的常量池条目是否为旧 IP若是则修改常量池索引使其指向新 IP 字符串。新建FixIPBytecode.java完整代码如下import javassist.*; import javassist.bytecode.*; public class FixIPBytecode { public static void main(String[] args) throws Exception { // TODO: 修改为你的旧IP和新IP String oldIp xxx.175.167.44; String newIp 10.0.0.5; ClassPool pool ClassPool.getDefault(); pool.insertClassPath(BOOT-INF/classes/); CtClass ctClass pool.get(com.xcr.socket.CollectorApplication); CtMethod[] methods ctClass.getDeclaredMethods(); for (CtMethod method : methods) { MethodInfo methodInfo method.getMethodInfo(); CodeAttribute codeAttr methodInfo.getCodeAttribute(); if (codeAttr null) continue; CodeIterator iterator codeAttr.iterator(); ConstPool constPool methodInfo.getConstPool(); while (iterator.hasNext()) { int index iterator.next(); int op iterator.byteAt(index); // 0x12 是 ldc 的操作码加载常量 if (op Opcode.LDC) { int constPoolIndex iterator.byteAt(index 1); if (constPool.getTag(constPoolIndex) ConstPool.CONST_String) { String currentStr constPool.getStringInfo(constPoolIndex); if (oldIp.equals(currentStr)) { int newConstPoolIndex constPool.addStringInfo(newIp); iterator.writeByte(newConstPoolIndex 0xff, index 1); System.out.println(在方法 method.getName() 中找到并替换常量: oldIp - newIp); } } } } } ctClass.writeFile(BOOT-INF/classes/); ctClass.detach(); System.out.println(Class 文件修改完成。); } }编译并运行javac -cp .;javassist.jar FixIPBytecode.java java -cp .;javassist.jar FixIPBytecode执行后控制台输出类似在方法 main 中找到并替换常量: xxx.175.167.44 - 10.0.0.5 Class 文件修改完成。此时BOOT-INF/classes/com/xcr/socket/CollectorApplication.class已被修改。4. 将修改后的文件更新回 jar 包注意不要重新打包整个 jar即不要用jar cf那样会破坏 Spring Boot 的启动信息。而是用jar uf只替换修改过的文件jar uf collector.jar BOOT-INF/classes/application.yml jar uf collector.jar BOOT-INF/classes/com/xcr/socket/CollectorApplication.class5. 清理临时目录并测试# 删除解压出的目录 rmdir /s /q BOOT-INF META-INF org # 运行修改后的 jar java -jar collector.jar观察日志确认新 IP 已生效。一键脚本Windows .bat为了方便可以将上述步骤整合成一个批处理脚本fix_ip.batecho off echo 1. 解压JAR... jar xf collector.jar echo 2. 修改application.yml... powershell -Command (Get-Content BOOT-INF\classes\application.yml) -replace 192.168.1.100, 10.0.0.5 | Set-Content BOOT-INF\classes\application.yml echo 3. 编译并运行Javassist修改class... javac -cp .;javassist.jar FixIPBytecode.java java -cp .;javassist.jar FixIPBytecode echo 4. 更新JAR包... jar uf collector.jar BOOT-INF/classes/application.yml jar uf collector.jar BOOT-INF/classes/com/xcr/socket/CollectorApplication.class echo 5. 清理临时目录... rmdir /s /q BOOT-INF META-INF org 2nul echo 完成新jar已生成collector.jar pause将FixIPBytecode.java和javassist.jar放在同一目录双击运行fix_ip.bat即可。常见问题与排错Q1: 运行javac时提示“找不到符号 ExprEditor / StringConst”这是因为之前网上有些教程使用了错误的类名。本文提供的FixIPBytecode.java直接操作常量池和字节码不依赖那些不存在的类可以避免此问题。Q2: 运行java时提示“ClassNotFoundException: javassist.ClassPool”请检查 classpath 是否包含javassist.jar且写法正确Windows 用分号分隔当前目录用.表示。正确命令bashjava -cp .;javassist.jar FixIPBytecodeQ3: Javassist 没有找到要替换的 IP 字符串先用javap确认 class 文件中确实存在该字符串bashjavap -v BOOT-INF/classes/com/xcr/socket/CollectorApplication.class | findstr xxx.175.167.44如果能看到类似#7 String ...的输出说明字符串存在于常量池。我们的脚本通过遍历所有ldc指令来匹配通常都能找到。Q4: 修改后 jar 无法启动提示“找不到主类”一定不要使用jar cf重新打包整个目录。必须使用jar uf只替换个别文件才能保留原 jar 中的META-INF/MANIFEST.MF和 Spring Boot 的启动类索引。Q5: PowerShell 替换 YAML 时格式错乱简单替换偶尔会改变文件编码或换行符。如果担心可以手动编辑application.yml或用专业文本编辑器替换。脚本中的 PowerShell 命令对于普通字符串替换是安全的。总结通过本文的方法你可以无需源码、无需反编译直接修改 Spring Boot fat jar 中的配置文件和字节码中的硬编码字符串。核心思路是用jar xf解压。直接编辑文本配置文件。使用 Javassist 操作字节码常量池替换ldc指令的目标字符串。用jar uf增量更新回原 jar。该方法适用于修改 IP 地址、数据库连接字符串、密钥等任何硬编码在 Java 代码中的字符串常量。希望这篇教程能帮你解决实际问题。如果你有其他修改场景比如修改数字常量、修改方法调用等也可以在评论区留言交流。本文配套资源下载Javassist jarhttps://repo1.maven.org/maven2/org/javassist/javassist/3.29.2-GA/javassist-3.29.2-GA.jar完整脚本和源码见文中代码块

相关文章:

Spring Boot Jar包修改配置文件和Class中硬编码IP的完整指南

前言 在实际开发中,我们有时会遇到这样的情况:从第三方或历史版本中拿到一个 Spring Boot 打好的 jar 包,但里面某个服务的 IP 地址是写死的(无论是在 application.yml 还是直接在 Java 代码中作为字符串常量)。由于无…...

西门子博图TIA Portal V18实战:用LAD梯形图快速搞定一个电机启停控制程序

西门子博图TIA Portal V18实战:用LAD梯形图快速搞定一个电机启停控制程序 第一次打开西门子TIA Portal时,面对密密麻麻的工具栏和英文界面,很多新手工程师都会感到无从下手。但当你真正用LAD梯形图完成第一个电机控制程序后,会发现…...

为Ollama本地大模型构建长期记忆模块:原理、部署与调优实践

1. 项目概述与核心价值最近在折腾本地大模型应用,特别是想让它能记住我们之前的对话,实现真正的“连续聊天”,而不是每次都像初次见面。相信很多朋友都遇到过类似的问题:今天告诉模型“我叫张三,喜欢编程”&#xff0c…...

Python智能光标工具py_cursor:轻量级代码编辑增强实践

1. 项目概述:一个能“看见”代码的智能工具最近在GitHub上看到一个挺有意思的项目,叫hack505/py_cursor。光看名字,你可能会以为它又是一个Python的代码格式化工具,或者是一个光标美化插件。但实际用下来,我发现它的定…...

AI助手数据损坏救援指南:ReClaw工具的原理与实战

1. 项目概述:当AI助手“脑死亡”时,你需要一个独立救援队如果你正在运行一个像OpenClaw这样的本地AI助手工作空间,那么你很可能已经体验过那种令人抓狂的时刻:助手突然“失忆”,无法启动,或者开始胡言乱语。…...

AI代码翻译工具Polyglot Transmogrifier:从语法转换到语义保持的跨语言编程实践

1. 项目概述:一个能“翻译”代码的AI技能最近在折腾一个叫OpenClaw的AI智能体平台,发现了一个挺有意思的技能,叫“Polyglot Transmogrifier”。这名字听起来有点唬人,直译过来是“多语言变形器”,但它的功能其实很直接…...

构建AI自进化系统:从自动化到自主演化的工程实践

1. 项目概述:一个能自我进化的AI系统在AI工程领域,我们常常面临一个困境:系统上线后,如何让它持续适应快速变化的技术环境?手动监控、分析和优化不仅耗时,而且容易滞后。今天要分享的,是我在Ope…...

通过 OpenClaw 配置 Taotoken 实现自动化 AI 任务处理

通过 OpenClaw 配置 Taotoken 实现自动化 AI 任务处理 OpenClaw 是一款功能强大的自动化 AI 任务处理工具,它允许开发者通过命令行或配置文件编排复杂的 AI 工作流。为了让这些工作流能够利用 Taotoken 平台聚合的多模型能力,我们需要将 OpenClaw 的请求…...

个人开源项目冷启动:从Hegelion看状态管理库的架构与社区运营

1. 项目概述:从“Hmbown/Hegelion”看个人开源项目的冷启动与价值塑造看到“Hmbown/Hegelion”这个项目标题,很多人的第一反应可能是困惑:这看起来像是一个GitHub仓库的地址,由用户名“Hmbown”和项目名“Hegelion”组成。它不像一…...

代码变现双擎:独立开发者的 Gumroad 与 CodeCanyon 掘金指南

除了接私活外包和打工,我们作为软件开发者,其实拥有天然的“造物”优势。我们在日常开发中顺手写出的各类脚本、UI 模板、系统插件,甚至是成型的完整小项目,都可以被打包成数字资产进行售卖。 今天,我们就来聊聊最适合…...

从Unix哲学到AI集成:OpenClaw CLI工具生态的工程实践

1. 项目概述:一个资深工程师的“工具箱”哲学如果你在GitHub上看到一个名为“psandis/psandis”的仓库,点进去发现不是某个具体的项目代码,而是一个人的个人主页,里面密密麻麻地陈列着几十个技术栈徽章和一系列自研工具&#xff0…...

AI趣味工具“寻根”:用分层匹配与可信度标签连接现代人与商朝历史

1. 项目概述:一个让历史“活”过来的AI趣味工具你有没有想过,自己姓氏的源头,可能比秦始皇统一六国还要早一千年?当我们在谈论“寻根问祖”时,常常会追溯到明清时期的族谱,但“寻根”(Xungen&am…...

API规范即代码:基于OpenAPI/Swagger的自动化管理与质量门禁实践

1. 项目概述:一个为开发者而生的API规范管理工具如果你和我一样,长期在软件开发的泥潭里摸爬滚打,尤其是在前后端分离、微服务架构成为主流的今天,一定对“接口文档”这四个字又爱又恨。爱的是,一份清晰、准确的API文档…...

长期使用 taotoken 后对其官方价折扣与活动价的实际节省感受

长期使用 Taotoken 后对其官方价折扣与活动价的实际节省感受 1. 个人开发者的成本观察 作为独立开发者,我使用 Taotoken 平台接入大模型 API 已有半年时间。最初选择该平台的主要原因之一是其透明的价格体系和定期推出的优惠活动。在实际使用过程中,我…...

zimage-skill:自动化Linux内核镜像处理工具详解与实践

1. 项目概述与核心价值 最近在折腾一些个人项目,经常需要在不同设备间同步和快速部署开发环境,尤其是那些依赖特定系统镜像和工具链的场景。手动下载、配置、验证,一套流程下来,半天时间就没了。后来在GitHub上看到了一个叫 Futu…...

面试官尬笑:你说半天就能读完一个开源项目源码,不就是用 AI 吗?我说:是用 DeepWiki,而且是 Codemap 模式!

👉 这是一个或许对你有用的社群🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事上…...

B#EVM轻量级嵌入式虚拟机架构与优化实践

1. B#EVM虚拟机架构解析在嵌入式系统开发领域,资源受限环境下的软件开发一直面临着特殊挑战。传统8/16位微控制器通常只有几KB的RAM和几十KB的Flash存储空间,这使得开发者不得不使用汇编或C语言进行开发,牺牲了现代编程语言的诸多优势。B#EVM…...

AI驱动幻灯片生成:Markdown+LLM如何提升开发者演示效率

1. 项目概述:一个面向开发者的AI驱动幻灯片生成工具最近在GitHub上看到一个挺有意思的项目,叫openclaw-slides。乍一看名字,可能觉得就是个普通的幻灯片工具,但深入了解后,我发现它瞄准的是一个非常具体且高频的痛点&a…...

高性能内存池AtlasMemory:原理、配置与多线程优化实践

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫Bpolat0/atlasmemory。乍一看这个名字,你可能会有点懵,“atlas”是地图集,“memory”是内存,这俩词放一起是啥意思?其实,这是一个专注…...

AI智能体安全治理实践:基于边车模式的Yigcore Sentinel部署与集成

1. 项目概述:为AI智能体戴上“紧箍咒” 最近在折腾各种AI智能体,比如OpenClaw这类能自主执行代码、操作文件的“数字员工”,功能确实强大,但用起来心里总有点发毛。相信不少同行都有过类似的经历:一个不留神&#xff…...

抖音下载器:你的数字内容管家,让创作效率提升15倍

抖音下载器:你的数字内容管家,让创作效率提升15倍 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…...

《Generative Deep Learning》第二版代码库:从VAE、GAN到扩散模型的实践指南

1. 项目概述与核心价值如果你对用代码“创造”内容感兴趣——无论是让AI画出梵高风格的画作,写一首十四行诗,还是生成一段从未存在过的音乐旋律——那么,由David Foster撰写的《Generative Deep Learning》第二版及其官方代码库,绝…...

WordPress Boost:AI辅助开发工具,提升WordPress项目内省与安全审计效率

1. 项目概述:当AI助手遇上WordPress开发如果你是一名WordPress开发者,或者正在管理一个基于WordPress构建的项目,那么你一定对这样的场景不陌生:为了修改一个功能,你需要花大量时间去翻看主题的functions.php文件&…...

自动驾驶占据网络OCC精细化平衡之道 | 全网深度解析,体素优化+TPV降维+稀疏推理篇 | ICCV 2025 | 引入三维优化策略,兼顾精度、速度与算力,助力高阶自动驾驶量产落地,附工程代码

目录 一、技术背景:OCC占据网络的行业困境与精细化平衡刚需 二、OCC精细化平衡核心技术定义与设计理念 三、三大核心技术深度拆解(含工程化实现细节) 3.1 核心技术一:体素优化——动态分辨率+优先级排序,平衡精度与算力 3.1.1 动态分辨率体素划分(核心创新点) 3.1…...

OpenMemory:跨平台原生内存追踪工具,解决堆外内存泄漏难题

1. 项目概述:一个面向开发者的内存分析利器最近在排查一个线上服务的性能瓶颈时,我又一次陷入了“内存去哪儿了”的经典困境。JVM堆内存监控看着一切正常,但物理内存却持续走高,直到触发OOM(Out of Memory)…...

UDS诊断协议深度剖析:0x31例程控制服务|全网最细报文拆解 + 量产级代码实现 + 车载实战案例|覆盖ISO 14229-1全场景,适配STM32/AURIX多MCU,解决量产高频故障

目录 一、0x31例程控制服务核心定义(ISO 14229-1:2020标准) 1.1 服务核心作用 1.2 服务核心特性(区别于其他UDS服务) 1.3 服务核心术语(量产开发必懂) 二、0x31服务报文字节级拆解(全网最细,含标准+自定义扩展) 2.1 基础格式约定(ISO 14229-1标准) 2.2 请求报…...

Cursor AI 编程助手省流神器:精细化控制 API 令牌消耗的浏览器扩展

1. 项目概述:一个为 Cursor 编辑器量身定制的“省流”神器如果你和我一样,日常重度依赖 Cursor 这款 AI 驱动的代码编辑器,那你一定对它的智能补全、代码解释和重构功能又爱又恨。爱的是它确实能极大提升开发效率,恨的是它背后消耗…...

PCB设计避坑指南:强电220V与弱电信号的安全间距到底留多少?(附FR4材料实测)

PCB设计避坑指南:强电220V与弱电信号的安全间距实战解析 在嵌入式硬件开发中,强弱电共板设计就像走钢丝——既要保证功能完整,又要确保安全可靠。去年我们团队就遇到过这样一个案例:某智能家居控制板在测试阶段突然冒烟&#xff0…...

管理Taotoken API Key实现安全的访问控制与审计

管理Taotoken API Key实现安全的访问控制与审计 对于企业或项目团队而言,在引入大模型能力时,API Key的安全管理是首要任务。一个泄露的Key可能导致未经授权的调用、费用失控甚至数据泄露。Taotoken平台提供了完整的API Key生命周期管理、细粒度访问控制…...

oncoPredict实战:如何用lncRNA表达数据预测545种抗癌药物敏感性?

基于lncRNA表达谱的肿瘤药物敏感性预测实战指南 在精准医疗时代,肿瘤治疗正从"一刀切"模式转向基于分子特征的个体化方案。长链非编码RNA(lncRNA)作为基因组中的"暗物质",近年被发现参与肿瘤发生、转移和耐药…...