新写的可直接编辑 Jar 包的 IDEA 插件-JarEditor

259 天前
liubsyy  liubsyy

前言

IDEA 自带的反编译插件能打开 jar 反编译 class ,遗憾的是不能编辑 class ,有的时候我们需要修改 jar 的时候还需要解压,反编译 class ,然后新建.java ,修改代码,再编译,最后打包 jar 。我敢说中间的过程你肯定不是一气呵成的,如果 jar 有依赖还要花时间去排查,打包的时候还需要注意编译 jdk 的版本,有的命令忘了的话还需要查手册,其实基本上全是体力活。

我翻遍了 IDEA 插件市场并没有找到合适的直接编辑 jar 的插件,于是我打算简单花点时间写一个这样的插件 JarEditor ,可以实现无需解压直接编辑 jar 内的文件。

功能介绍

首先 IDEA 可以反编译 jar ,在 jar 内的 class 是可以直接打开看到反编译代码的,外部文件可以通过 File->Project Structure->Libraries 添加依赖然后反编译 jar 。

使用介绍

在插件市场安装插件 JarEditor 后,可以在.class 反编译文件中看到一个切换到 Jar Editor 的 tab 页

点击 Jar Editor 后可以直接对反编译的代码进行修改,修改完之后点击 Save/Compile 会编译当前修改的 java 内容并保存,然后点击 Build Jar 即可将编译保存的 class 文件写入到 Jar 包内。

这样编辑一个 Jar 包内 class 文件一气呵成无需解压也无需去敲命令。

下面是一个流程演示例子:

JarEditor_example.gif

修改 jar 包内的资源文件也是支持的,流程和 class 文件是一样的,也是修改完要保存,然后再 Build Jar 即可。

在 jar 包的工程展示图,任意文件右键,可以看到 JarEditor 的 New 和 Delete 操作,可以新增文件和删除文件


一些机制

  • 编译依赖的 JDK 是项目工程的 JDK ,可以选择编译的 class 目标版本,默认和 jar 包的 class 版本保持一致
  • 编译 java 的时候依赖的 classpath 就是工程项目的依赖,如果依赖包找不到可以添加依赖
  • Save/Compile 会将修改的文件保存到 jar 包所在目录的 jar_edit 子目录下,Build Jar 会把会 jar_edit 目录的文件增量写入 jar ,最后再删除这个目录

总结

此 IDEA 插件 JarEditor 可无需解压直接编辑 jar 包内 class 和资源文件,感兴趣的朋友可以去试试。

源码地址:https://github.com/Liubsyy/JarEditor

依赖 IDEA 最低版本为 IDEA2020.3 ,大于等于这个版本均可安装使用。

欢迎交流!

JarEditor_add_delete.png
JarEditor_main.png
2488 次点击
所在节点    分享创造
23 条回复
tuimaochang
259 天前
楼主牛逼
yulgang
259 天前
楼主牛逼
guiling
259 天前
试了可以打包,666
weijancc
259 天前
看了描述挺不错的, 我以前经常有这个编辑 jar 内 class 的需求, 不过现在没有了.
9c04C5dO01Sw5DNL
259 天前
真的,第一反应就是两个字:牛逼
GuryYu
259 天前
这个功能非常实用,感谢楼主
imokkkk
259 天前
牛逼
hexiaowu1993
259 天前
op ,牛逼!
proxytoworld
259 天前
厉害,这个直接编译咋实现的,对 java 不太熟
bxb100
259 天前
@proxytoworld jar 解压缩, 然后将 class 反编译成 java, 改完之后再编译回 class 替换, 打包回 jar
OrangeAdd
259 天前
大佬🐮🍺
beldon
259 天前
大佬牛批,先下载玩玩
EmpCold
259 天前
大佬要火,先看看!
rxmt
259 天前
大佬牛逼!!这就试试去
zx9481
259 天前
Build 是什么原理,请问是用当前项目设置的 jdk 进行编译的吗?
DiDr
259 天前
维护老项目很好用啊,之前都是替换 class
liubsyy
259 天前
@proxytoworld @zx9481 针对反编译的 class 源码使用运行时编译 JavaCompiler 编译增量的 class ,Build Jar 的时候将增量文件写入 jar 包内,目前是使用项目 jdk 编译,不设置 jdk 也可以编译(IDEA 运行时自带 jdk)
liubsyy
259 天前
楼上的朋友过奖了,插件我也只是简单花了几个晚上写的,如果有 bug 欢迎大家指出和修改,有需要完善的建议也可以提
utre938722
254 天前
我之前都是替换 class 真的很烦,先装上回头试用
liubsyy
234 天前
v1.4 更新:
1. 支持 kotlin
2. 可选择是否需要编译(java,class,kt 等)
3. SDK 自定义设置
4. 重命名文件/文件夹
5. jar 包内复制文件到任何外部文件夹
6. 外部剪切板文件/文件夹复制到 jar 内

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1041593

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX