走进IDE的世界
做Intellij插件开发是个比较麻烦的事,最大的问题就是社区不成熟,而插件开发本来也是松散的知识点居多,所以难免让人觉得举步维艰。
比较好的参考资料是JetBrains官方的文档,但是内容仍然太少,如果想只依靠它开发,那是有相当的难度。
所幸Intellij的community版本是开源的,这就表示:**其实你可以通过看源码来了解如何开发!**这听起来有点疯狂,但是如果付出足够的时间,这可能是最有效的方法。
编译community代码
Intellij-community的源码在https://github.com/JetBrains/intellij-community。没什么技巧,clone下来就可以了。这是个艰难的过程,我是半夜挂了一晚才下载好的。
下载好源码,还需要编译才能使用。先git tag
选择一个合适的版本,例如idea/129.1521
,这是截止本文时候,IDEA 12的最新版。
然后用Ant编译之:ant
。过程依然很漫长。
使用Intellij开发插件
编译完成,先不着急。这个编译好的Intellij会作为容器,这是我们开发插件的运行环境。但是我们插件的开发环境,我们依然可以使用平时使用顺手的Intellij版本。之后新编译好的community为SDK,并附加上源码,此时就可以顺畅的开发了。
Intellij SDK一览
Intellij SDK由一系列依赖组成。Intellij里集成了一些常用的开源库,例如guava,httpclient,netty等等,而插件开发相关主要的API在openapi.jar
里。openapi的结构是按照功能模块组织的,相应的概念比较多,但是大部分都不算太复杂。
开发第一个插件
这里还是推荐一下官方的一个demo,是一个基于生成基于Guava API的compare方法的工具:
视频: http://blog.jetbrains.com/idea/2012/12/webinar-recording-live-coding-a-plugin-from-scratch/
代码: https://github.com/yole/comparisonChainGen
Action
其实初学插件开发,80%时间都在做一件事:寻找扩展点。
例如我要在菜单里加一个button,那么这个button按照什么规范写,放到什么地方?
Action
是Intellij插件的入口,它可能是一个button,一个菜单项等等。用户操作了这部分控件,就会触发Action。开发第一个Action很简单,实现AnAction
接口即可。Action的入口有一个Group
,Group可以理解为插件留给其他插件的扩展点,每个group有一个group-id
。例如菜单有Menu
,工具栏有MainToolBar
,等等。可惜这些个文档不太全,怎么办呢?
这个时候源码就派上用场的了。假设我们想要在工具栏添加一个按钮,但是我们不知道group-id。那么可以先随便添加一个id,然后debug,不出意外就抛出异常了,然后我们通过断点,顺藤摸瓜,找到可用的Group,再分析可能的group-id,然后测试,如此往复…
Extension
如果说Action是主动触发的扩展点,那么Extension则是在插件的运行过程中,被动插入的扩展点。
例如execution模块负责Java程序的启动和debug,它预留了扩展点java.programPatcher
,用于在启动之前,修改启动参数。
<extensions defaultExtensionNs="com.intellij">
<java.programPatcher implementation="com.dianping.idea.mocksocks.MocksocksRunPatcher"/>
</extensions>
就写到这吧,Intellij 插件开发资料实在太少,做东西有点艰难,写个文章记录一下。