👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事中“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn 【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本
来源:juejin.cn/post/
7388056383642878006
背景 插件安装 插件使用 1. 修改class文件 2. 修改配置和资源文件 3. JAR包内新增文件 4. 删除JAR包内文件 5. 重命名文件 6. 拷贝JAR包内文件到外部文件夹 7. 粘贴外部文件到JAR包内 8. JAR包内搜索字符串 9. Source jar的支持 10. 导出source jar 11. 字节码修改工具 一些机制和原理 总结
背景
在开发中我们有时会遇到这样的场景,需要修改jar包内某个class,常见的方法就是先解压缩,然后反编译这个class,新建java修改再编译,最后再打包,整个过程是非常耗时的。
这里向大家介绍一款IDEA插件:JarEditor,可以一键修改JAR包内文件,无需解压。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/
插件安装
首先在插件商城搜索JarEditor,可直接安装插件
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud 视频教程:https://doc.iocoder.cn/video/
插件使用
1. 修改class文件
安装完后,任意打开一个jar的class,可以看到反编译后的class内容,选中Jar Editor的tab页签,就可以直接编辑class了
修改完代码后先点击 Save,这个过程会编译class,编译成功后点击Build Jar就修改jar完成了,是不是很简单?
SDK可以选择需要的JDK或者其他SDK,Target为编译class的目标版本,默认是和反编译的class前的版本保持一致。
附:修改外部jar
选择File->Project Structure->Libraries
,然后添加工程外的jar即可打开jar内文件修改
也可以将jar包粘贴到本项目中,然后右键->Add as Library...
2. 修改配置和资源文件
操作流程同修改class 文件,不要勾选Compile,改完文本后以此点击 Save -> Build Jar
即可修改配置文件和资源文件。
3. JAR包内新增文件
在工程视图jar包内某个文件夹上右键->JarEditor->New
,可以新建Class/Kotlin/File/Directory
选择后输入文件名即可在jar内新增文件,默认是空文件
新增后打开可以写入内容,Class和Kotlin新建完文件是有模版的,无需后缀名,如果是JarEditor->New->File
则需要写文件后缀名。
4. 删除JAR包内文件
在工程视图jar包内某个文件或者文件夹上右键->JarEditor->Delete
,则会删除选择的目录或者文件,支持多选。
5. 重命名文件
在工程视图jar包内某个文件或者文件夹上右键->JarEditor->Rename
,输入名字后即可将原来的名字修改为新的名字,修改完立即生效。
6. 拷贝JAR包内文件到外部文件夹
在工程视图jar包内某个文件或者文件夹上右键->JarEditor->Copy
,可以将jar包内文件拷贝到剪切板(支持多选)
然后在外部任意一个文件夹内,使用Ctrl+V,即可将刚才复制的文件拷贝到这个目录
7. 粘贴外部文件到JAR包内
外部文件使用Ctrl+C复制后,在jar内某个文件夹上右键->JarEditor->Paste
(不能直接用Ctrl+V,Ctrl+V被IDEA默认占用了),即可将剪切板的文件粘贴到jar包内,一气呵成。
8. JAR包内搜索字符串
工具栏有一个搜索图标,点击后输入需要搜索的字符串,可搜索到jar包内的文件,包括class和普通文件。
点击搜索后的文件列表,可跳转到具体的文件
搜索的class如果是class jar
的话取决于反编译的内容,如果是source jar
取决于java文本。
9. Source jar的支持
IDEA内打开的jar分两种,class jar
和source jar
,如果下载了源码的话,打开的是source jar
,即打开的是一个java文件,而不是class文件,这里一定要注意
此时如果修改代码的话,生效的是source jar
,比如这里改的是FindInstancesOfClass-1.0.3-sources.jar
。
那如何修改class jar呢?
点击 JarEditor Tools
上面的跳转链接:Click hear to open class jar
即可跳转到class文件
此时展示的class为反编译的代码,可修改class 文件,按 修改class文件 的流程操作即可。
也可以从source jar中导入代码:Import from source jar
Import from source jar
和直接在souce jar
中的java修改的区别是:前者修改的是class jar
后者是source jar
。
10. 导出source jar
在class jar
上面右键->JarEditor->Export->source jar
,即可导出反编译源码到新的jar
11. 字节码修改工具
以上修改jar的方式依赖于jdk编译,有时混淆过的jar只有变量和函数a,b,c,d这样的名称,反编译的效果不是很好不适合再次源码修改和文件编译(普通编译校验非常严格,混淆代码往往会编译失败),这个时候就可以使用Class bytes tool
了。
点击JarEditor面板的 Class bytes tool
图标,可以选择直接修改字节码的工具。
Javassist : 可以对局部字段和函数进行增/删/改,用接近原生java代码的风格修改字节码,非常适合修改混淆jar,注意javassist和原生java的语法有一定区别,比如不支持泛型,不支持增强for循环,不支持lambda表达式等高级特性。
选择具体的Modify/Add
可在Code中修改代码,导入的包在import编辑器中填写,点击 Run 执行javassist操作修改字节码并保存,点击 Build Jar
即可使修改的jar生效。
一些机制和原理
SDK的选择
目前支持java和kotlin两种文件编译,后续可能会增加更多的编译文件支持。
选择 SDK Default
时,是使用的IDEA运行时自带编译器,即 javax.tools.JavaCompiler
,详细可阅读源码。选择其他JDK时,默认使用的是javac外部命令编译。
编译时选择的Target的范围是1.1~所有JDK的版本最大值。
Save(Compile)
考虑到可能会修改多个文件,点击 Save 会将当前修改的内容(编译)保存到所在jar包目录的临时目录 jar名_temp/jar_edit_out
下,当点击Build Jar
将增量文件写入jar后,会删除临时目录。
也可点击清理图标的icon手动清理临时目录。
编译依赖
在编译时,依赖的jar为当前工程的Libraries,如果编译时提示依赖包找不到,可以添加依赖即可。
另外class文件的内容取决于反编译的结果,如果混淆的代码建议直接用上文的字节码修改工具。
SDK Default
当选择SDK Default编译时,使用的是Jetbrains集成的运行时JDK(JBR),如果不选SDK Default则是具体用户安装的JDK
总结
本文主要介绍了使用JarEditor直接对jar包文件进行增删改查操作,简化了修改jar的流程,感兴趣的朋友可以去试试。
本文篇幅有限,具体原理和实现细节可阅读源码
源码:
https://github.com/Liubsyy/JarEditor
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)