作Intellij插件開發是個比較麻煩的事,最大的問題就是社區不成熟,而插件開發原本也是鬆散的知識點居多,因此不免讓人以爲舉步維艱。java
比較好的參考資料是JetBrains官方的文檔,可是內容仍然太少,若是想只依靠它開發,那是有至關的難度。git
所幸Intellij的community版本是開源的,這就表示:**其實你能夠經過看源碼來了解如何開發!**這聽起來有點瘋狂,可是若是付出足夠的時間,這多是最有效的方法。github
Intellij-community的源碼在https://github.com/JetBrains/intellij-community。沒什麼技巧,clone下來就能夠了。這是個艱難的過程,我是半夜掛了一晚才下載好的。web
下載好源碼,還須要編譯才能使用。先git tag
選擇一個合適的版本,例如idea/129.1521
,這是截止本文時候,IDEA 12的最新版。api
而後用Ant編譯之:ant
。過程依然很漫長。ide
編譯完成,先不着急。這個編譯好的Intellij會做爲容器,這是咱們開發插件的運行環境。可是咱們插件的開發環境,咱們依然可使用平時使用順手的Intellij版本。以後新編譯好的community爲SDK,並附加上源碼,此時就能夠順暢的開發了。工具
Intellij SDK由一系列依賴組成。Intellij裏集成了一些經常使用的開源庫,例如guava,httpclient,netty等等,而插件開發相關主要的API在openapi.jar
裏。openapi的結構是按照功能模塊組織的,相應的概念比較多,可是大部分都不算太複雜。測試
這裏仍是推薦一下官方的一個demo,是一個基於生成基於Guava API的compare方法的工具:idea
視頻: http://blog.jetbrains.com/idea/2012/12/webinar-recording-live-coding-a-plugin-from-scratch/插件
代碼: https://github.com/yole/comparisonChainGen
其實初學插件開發,80%時間都在作一件事:尋找擴展點。
例如我要在菜單里加一個button,那麼這個button按照什麼規範寫,放到什麼地方?
Action
是Intellij插件的入口,它多是一個button,一個菜單項等等。用戶操做了這部分控件,就會觸發Action。開發第一個Action很簡單,實現AnAction
接口便可。Action的入口有一個Group
,Group能夠理解爲插件留給其餘插件的擴展點,每一個group有一個group-id
。例如菜單有Menu
,工具欄有MainToolBar
,等等。惋惜這些個文檔不太全,怎麼辦呢?
這個時候源碼就派上用場的了。假設咱們想要在工具欄添加一個按鈕,可是咱們不知道group-id。那麼能夠先隨便添加一個id,而後debug,不出意外就拋出異常了,而後咱們經過斷點,順藤摸瓜,找到可用的Group,再分析可能的group-id,而後測試,如此往復…
若是說Action是主動觸發的擴展點,那麼Extension則是在插件的運行過程當中,被動插入的擴展點。
例如execution模塊負責Java程序的啓動和debug,它預留了擴展點java.programPatcher
,用於在啓動以前,修改啓動參數。
<extensions defaultExtensionNs="com.intellij"> <java.programPatcher implementation="com.dianping.idea.mocksocks.MocksocksRunPatcher"/> </extensions>
就寫到這吧,Intellij 插件開發資料實在太少,作東西有點艱難,寫個文章記錄一下。