作者 | 时间 | |
---|---|---|
刘权 | 20180613 | 653945222 |
原因
由于要修改现场的一个jar包,但是现场没有项目的编译环境
方案一:通过反编译工具获取java文件,再通过java将class打包到jar包中
- 使用反编译工具JD-GUI打开jar包
- 找到要修改的类
- FIle->save(保存class的java文件)
- 使用文编编辑器修改java文件,并保存
- 将java文件放入对应的包路径下
- 执行javac -cp xx.jar com\epri\service\HelloService.java,生成对应的class文件
- 将class打包到jar包
方案一:使用命令: jar -uvf xx.jar com\epri\service\HelloService.class
方案二:使用解压工具打开jar包,然后将class放入对应位置替换原class即可。
方案二:使用arthas反编译出源代码,再使用arthas编译成class文件
- 前提条件:这种方式需要程序在运行中才可以。
- 下载arthas压缩包
- 解压压缩包
- 进入arthas/bin目录
- 启动arthas
- 输入应用的序号,回车
- 反编译:
jad --source-only com.epri.service.HelloService > /tmp/HelloService.java
- 修改源代码:
/tmp/HelloService.java
- 获取com.epri.service.HelloService类的classloader的hashcode(下一步要用):
sc -d com.epri.service.HelloService
,这里获取到的classloader的hashcode为3d4eac69
$ sc -d com.epri.service.HelloService
class-info com.epri.service.HelloService
code-source /private/tmp/hello.jar
name com.epri.service.HelloService
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
Affect(row-cnt:1) cost in 875 ms.
- 编译java类:
mc -c 3d4eac69 /tmp/HelloService.java -d /tmp
,编译后,在/tmp就会有HelloService.class文件 - 将class打包到jar包
方案一:使用命令: jar -uvf xx.jar com\epri\service\HelloService.class(ps:需要先创建目录com\epri\service,然后将class文件放到service目录中,该命令执行需要在com的上一层目录执行)
方案二:使用解压工具打开jar包,然后将class放入对应位置替换原class即可。
相关问题:
- 如果依赖的包为多个。
- 多个依赖的JAR包,LINUX下用“:”分割,WINDOW下用“;”分割
- 多个源文件用空格分隔,也可以使用诸如“*”之类的通配符
例:
javac -cp D:\Desktop\test.jar;D:\software\android\sdk\platforms\android-27\android.jar test1.java test2.java
或
javac -cp D:\Desktop\test.jar;D:\software\android\sdk\platforms\android-27\android.jar *.java
- javac编译错误: 编码UTF8/GBK的不可映射字符
- 确定java文件的编码
- 在编译时指定编码:javac编译错误: 编码UTF8/GBK的不可映射字符
例:
javac -encoding utf-8 -cp xx.jar com\epri\service\HelloService.java
参考文献:
https://blog.csdn.net/Leytton/article/details/52740171
https://blog.csdn.net/chy555chy/article/details/78460837
https://blog.csdn.net/foxfire882/article/details/70513642