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的内容刚好就是启动工程。那就正常增量打包即刻!

 

posted @ 2024-06-12 14:43  心住神明  阅读(49)  评论(0编辑  收藏  举报