jar、war 任意修改并且二次打包详细流程
遇到部分项目源码不完整。但是生产环境上部署的 war、jar是正常的。那么直接使用线上的 包 反编译修改业务。达到维护更新的效果。
1:反编译工具查看包 --- 并且解压war、jar
反编译查看业务代码。确定你要修改的文件。
用到的指令:
解压war、jar、压缩增量打包
jar xvf you.war jar xvf you.jar
重新将修改后的文件打包回去
jar -uvf you.jar class路径/xx.class 如需替换了多个.class文件 使用以下命令: jar -uvf you.jar class路径/
2:修改要替换的文件(.class文件修改)
这里要注意:非.class文件可以随意改。.class文件推荐用以下方式: javassist 工具 ,重写字节流方式修改。
2.1:新建一个maven工程添加以下依赖
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.26.0-GA</version> </dependency>
2.2:将要修改的jar/war 放到工程根目录下
2.3:使用 javassist重写 .class字节流
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:增量重新打包
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对应的目录里头。并且。使用 《存储模式》
否则部署工程直接启动保存报错
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的内容刚好就是启动工程。那就正常增量打包即刻!