jar、war 任意修改并且二次打包详细流程
遇到部分项目源码不完整。但是生产环境上部署的 war、jar是正常的。那么直接使用线上的 包 反编译修改业务。达到维护更新的效果。
1:反编译工具查看包 --- 并且解压war、jar
反编译查看业务代码。确定你要修改的文件。
用到的指令:
解压war、jar、压缩增量打包
1 2 | jar xvf you.war jar xvf you.jar |
重新将修改后的文件打包回去
1 2 3 | jar -uvf you.jar class 路径/xx. class 如需替换了多个. class 文件 使用以下命令: jar -uvf you.jar class 路径/ |
2:修改要替换的文件(.class文件修改)
这里要注意:非.class文件可以随意改。.class文件推荐用以下方式: javassist 工具 ,重写字节流方式修改。
2.1:新建一个maven工程添加以下依赖
1 2 3 4 5 | <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version> 3.26 . 0 -GA</version> </dependency> |
2.2:将要修改的jar/war 放到工程根目录下
2.3:使用 javassist重写 .class字节流
1 2 3 4 5 6 | ClassPool.getDefault().insertClassPath( "sms-module-1.0.jar" ); // 添加jar包,取当前项目根目录下的文件 CtClass SMSServiceClass = ClassPool.getDefault().getCtClass( "com.xxx.im.sms.SMSServiceImpl" ); // 获取类 CtMethod method = SMSServiceClass.getDeclaredMethod( "isAvailable" ); // 获取方法 String body = "return true;" ; // 修改方法体 method.setBody(body); // SMSServiceClass.writeFile(); //写出.class字节流 |
执行完成后,会在根目录生成修改后的.class文件
发现 isAvailable 这个方法成功修改未强制返回true。达到业务效果
2.4:将修改后的.class文件替换掉 之前解压出来的对应的.class文件
2.5:增量重新打包
1 2 3 4 5 | jar -uvf you.jar class 路径/xx. class 如需替换了多个. class 文件 使用以下命令: jar -uvf you.jar class 路径/ |
3:最最最大的大坑要注意:
如果:你遇到的是 jar中jar。即:你要修改jar包中的lib包里头的jar。那么你修改完lib里头的jar重新增量打包后。一定注意:
部署工程的jar/war 使用压缩工具wrar打开。将你修改、增量打包好的jar直接拉到压缩工具wrar对应的目录里头。并且。使用 《存储模式》
否则部署工程直接启动保存报错
1 2 3 4 5 6 7 8 9 10 11 12 13 | Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/xxx-xxx- 1.0 . 0 .jar at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java: 120 ) at org.springframework.boot.loader.archive.JarFileArchive$NestedArchiveIterator.adapt(JarFileArchive.java: 274 ) at org.springframework.boot.loader.archive.JarFileArchive$NestedArchiveIterator.adapt(JarFileArchive.java: 265 ) at org.springframework.boot.loader.archive.JarFileArchive$AbstractIterator.next(JarFileArchive.java: 226 ) at org.springframework.boot.loader.ExecutableArchiveLauncher.createClassLoader(ExecutableArchiveLauncher.java: 87 ) at org.springframework.boot.loader.Launcher.launch(Launcher.java: 55 ) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java: 88 ) Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/xxx-xxx-1.0.0.jar' at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java: 306 ) at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java: 292 ) at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java: 116 ) ... 6 more |
当然。这种情况是war/jar 里头还有jar。你刚好改的是 lib里面的jar。然后替换依赖的时候一定一定要注意这个情况。
如果你修改的war/jar的内容刚好就是启动工程。那就正常增量打包即刻!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!