V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
liubsyy
V2EX  ›  分享创造

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

  •  2
     
  •   liubsyy · 215 天前 · 2390 次点击
    这是一个创建于 215 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    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 页

    JarEditor_main.png

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

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

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

    JarEditor_example.gif

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

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

    JarEditor_add_delete.png

    一些机制

    • 编译依赖的 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 ,大于等于这个版本均可安装使用。

    欢迎交流!

    23 条回复    2024-09-06 09:24:22 +08:00
    tuimaochang
        1
    tuimaochang  
       215 天前
    楼主牛逼
    yulgang
        2
    yulgang  
       215 天前
    楼主牛逼
    guiling
        3
    guiling  
       215 天前
    试了可以打包,666
    weijancc
        4
    weijancc  
       215 天前
    看了描述挺不错的, 我以前经常有这个编辑 jar 内 class 的需求, 不过现在没有了.
    9c04C5dO01Sw5DNL
        5
    9c04C5dO01Sw5DNL  
       215 天前
    真的,第一反应就是两个字:牛逼
    GuryYu
        6
    GuryYu  
       215 天前
    这个功能非常实用,感谢楼主
    imokkkk
        7
    imokkkk  
       215 天前
    牛逼
    hexiaowu1993
        8
    hexiaowu1993  
       215 天前
    op ,牛逼!
    proxytoworld
        9
    proxytoworld  
       215 天前
    厉害,这个直接编译咋实现的,对 java 不太熟
    bxb100
        10
    bxb100  
       215 天前
    @proxytoworld jar 解压缩, 然后将 class 反编译成 java, 改完之后再编译回 class 替换, 打包回 jar
    OrangeAdd
        11
    OrangeAdd  
       215 天前
    大佬🐮🍺
    beldon
        12
    beldon  
       215 天前
    大佬牛批,先下载玩玩
    EmpCold
        13
    EmpCold  
       215 天前
    大佬要火,先看看!
    rxmt
        14
    rxmt  
       215 天前
    大佬牛逼!!这就试试去
    zx9481
        15
    zx9481  
       215 天前
    Build 是什么原理,请问是用当前项目设置的 jdk 进行编译的吗?
    DiDr
        16
    DiDr  
       215 天前
    维护老项目很好用啊,之前都是替换 class
    liubsyy
        17
    liubsyy  
    OP
       215 天前
    @proxytoworld @zx9481 针对反编译的 class 源码使用运行时编译 JavaCompiler 编译增量的 class ,Build Jar 的时候将增量文件写入 jar 包内,目前是使用项目 jdk 编译,不设置 jdk 也可以编译(IDEA 运行时自带 jdk)
    liubsyy
        18
    liubsyy  
    OP
       215 天前 via iPhone
    楼上的朋友过奖了,插件我也只是简单花了几个晚上写的,如果有 bug 欢迎大家指出和修改,有需要完善的建议也可以提
    utre938722
        19
    utre938722  
       210 天前
    我之前都是替换 class 真的很烦,先装上回头试用
    liubsyy
        20
    liubsyy  
    OP
       190 天前
    v1.4 更新:
    1. 支持 kotlin
    2. 可选择是否需要编译(java,class,kt 等)
    3. SDK 自定义设置
    4. 重命名文件/文件夹
    5. jar 包内复制文件到任何外部文件夹
    6. 外部剪切板文件/文件夹复制到 jar 内
    likeme
        21
    likeme  
       167 天前
    试了下很好用。但是面对一些混淆过的 jar 包就不行了,貌似需要重新编译,由于混淆包的一些 class/方法名称混淆显示成乱七八糟的符号导致无法编译。

    挺奇怪的,用 javassist 可以改,但是 javassist 改 class 真的好麻烦,希望可以优化一下
    liubsyy
        22
    liubsyy  
    OP
       104 天前
    @likeme 集成了 javassist ,可以对字段和函数进行增删改,使用非常简单,比较适合修改混淆 jar
    likeme
        23
    likeme  
       103 天前
    @liubsyy #22 卧槽,试了下,牛逼。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2645 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.