需求:银行跑批任务执行时要调用行方自己的短信平台给科技部人员发送短信,行方提供一个jar文件,通过shell脚本传参调用即可。
问题点:shell脚本调用jar包没太大问题,关键在于,需要在jar包中的某个类中配置短信平台的用户名、密码。
解决方案:将jar反编译—>保存为.java文件—>修改文件内容—>重新编译—>将原来jar包解压—>替换class文件—>压缩为jar包。
是时候表演真正的技术啦!首先,看一下我的msg.jar包的结构,直接解压是这样式的~
我要修改的代码就是这个T.class,但是class文件没办法直接修改,
所以我们需要反编译工具,我使用的是jd-gui。
链接:https://pan.baidu.com/s/1qP4N8Uvss8lRbWp_1h91Fg
提取码:i6mk
打开后:
反编译还是没办法直接修改的,Ctrl+S将其保存为.java文件
保存之后就可以通过编辑工具进行修改了,因为我的这个类是依赖了其他很多类的,修改完直接javac编译该文件会报错,
所以,我们要建一个项目,为这个java文件配置相同的目录结构,把这个类所依赖的jar包(其实就是本jar包,但是要先解压,然后把该类的class文件删掉,再压缩为jar文件即可,压缩为jar包的方式见后边)导入,将项目打成jar包,再将jar包解压,将修改的类的class文件拿出来就可以了。
为了简便,我用idea直接建了一个spring boot项目,
因为我要改的class文件就在jar包根目录下,所以我直接保存后的java文件放到启动类同目录就行了,如果不是的话,根据class文件所在jar包的目录结构在项目中创建对应目录结构即可。
这时候,其实是会报错的,因为依赖的很多类都没有,但我已经引入jar包了,所以不会报错。
引入剔除该class文件的jar包
还有修改一下jdk之类的操作不细说了,pom文件加一下本地jar包依赖、jdk版本、和编译打包的一些依赖配置。
<properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.jugan.util</groupId> <artifactId>com.jugan.util</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/msg.jar</systemPath> </dependency> </dependencies> <build> <resources> <resource> <directory>lib</directory><!-- <targetPath>BOOT-INF/lib/</targetPath>--> <includes> <include>F:/workspace/msg/lib/msg.jar</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>然后,修改代码
maven 编译打包
编译打包成功,去把打好的jar包中的class文件拿出来,替换掉原始jar包中的class文件,
然后将其压缩为jar包。
注意,在解压缩的jar包的文件夹里边选中所有文件进行压缩,直接压缩文件夹的话,会多出一层。
大功告成。