修改jar包中class⽂件
需求:银⾏跑批任务执⾏时要调⽤⾏⽅⾃⼰的短信平台给科技部⼈员,⾏⽅提供⼀个jar⽂件,通过shell脚本传参调⽤即可。问题点:shell脚本调⽤jar包没太⼤问题,关键在于,需要在jar包中的某个类中配置短信平台的⽤户名、密码。
解决⽅案:将jar反编译—>保存为.java⽂件—>修改⽂件内容—>重新编译—>将原来jar包解压—>替换class⽂件—>压缩为jar包。
是时候表演真正的技术啦!
⾸先,看⼀下我的msg.jar包的结构,直接解压是这样式的~
我要修改的代码就是这个T.class,但是class⽂件没办法直接修改,
所以我们需要反编译⼯具,我使⽤的是jd-gui。
链接:
提取码: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>maven打包本地jar包
<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>
然后,修改代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论