最近有一个软件,一切都挺好用的,就是不支持我们公司的版本控制系统。只有商业版才支持——但是只为了这么一个plugin就去买个商业版太亏了。所以就搞了一点手脚,扒了一个plugin出来,记录一下。

  1. 简单的安装那个plugin,失败:需要商业版本

  2. unzip plugin.jar:很显然的有一个Verifier.class看起来很扎眼,反编译一下,里面在做一些类似RSA之类的计算。果断改编之,使其成为一个空方法。

  3. plugin.xml是一个描述文件,里面写了depends on商业版,去掉。

  4. 再启动,有一个Verifier相关class找不到。这个软件使用pico作为container,作为constructor来说,有个很奇怪的class需要resolve dependency。还好这个class的接口很小,写一个空的class(反正verifier也是空的),然后在原有class上派生一个新的plugin class,直接new这个class给父类的constructor,这样,pico就只需要resolve剩余的三个dependency。。

  5. 一切看起来就ok了。最后的问题是,这个plugin引用了商业版某个实现类的一个XXXImpl.DEBUG的字段(真糟糕)。没办法,只好用javassist搞免费版本的class,给他强行加一个DEBUG字段:

import javassist.*;
cp = ClassPool.getDefault()
cp.appendClassPath('/Applications/my.app/lib/pro.jar')
c = cp.get("com.i.o.v.ChangeListManagerImpl")
debug = new CtField(CtClass.booleanType, "DEBUG", c)
debug.setModifiers(Modifier.PUBLIC|Modifier.STATIC)
c.addField(debug)
b = c.toBytecode()
new FileOutputStream("A.class").write(b)

在重新package这个jar,搞定。so far so good..