新同事從 0 到 1 開發(fā)一個(gè) IntelliJ IDEA 插件,網(wǎng)友:已收藏!
點(diǎn)擊上方[全棧開發(fā)者社區(qū)]→右上角[...]→[設(shè)為星標(biāo)?
點(diǎn)擊領(lǐng)取全棧資料:全棧資料
開發(fā)環(huán)境
開發(fā)IDEA插件有以下這些依賴:
IntelliJ IDEA Community Edition
IntelliJ IDEA Community Edition 源碼
Plugin DevKit 插件
IntelliJ Platform SDK
你可能已經(jīng)安裝了Ultimate版本,但是你還是需要安裝IDEA的社區(qū)版本。因?yàn)樯虡I(yè)版是閉源的,所以在調(diào)試時(shí)無(wú)法調(diào)試核心代碼。
社區(qū)版的安裝包里是不包含源碼的,所以我們需要手動(dòng)從github上clone一份:
git clone --depth 1 git://git.jetbrains.org/idea/community.git idea關(guān)于從源碼運(yùn)行IDEA的方法參考:Check Out And Build Community Edition
添加 IDEA jdk
雖然不知道原因,但是根據(jù)Check Out And Build Community Edition,我們需要建立一個(gè)IDEA jdk?來(lái)運(yùn)行插件:

除非你在Mac上使用官方JDK,否則你需要手動(dòng)添加?/lib/tools.jar?到classpath中。
配置 IntelliJ Platform SDK
打開?File | Project Structure?新建一個(gè)?IntelliJ Platform SDK:

Java SDK 選擇我們剛剛建立的?IDEA jdk:

然后我們可以把下載的 IDEA 社區(qū)版源碼添加到源碼路徑中,這樣在調(diào)試時(shí),就可以調(diào)試 IDEA 自身的代碼了:


第一個(gè)插件
我們來(lái)編寫一個(gè)最簡(jiǎn)單的插件來(lái)學(xué)習(xí)編寫一個(gè)插件的完整步驟。
新建工程
選擇IntellJ Platform Plugin,然后Project SDK指定剛剛新建的plugin sdk:

新建的插件項(xiàng)目:

插件根目錄下有兩個(gè)目錄src和resources。src是插件代碼目錄,resource是插件資源目錄,其中META-INF/plugin.xml是插件的描述文件,就像Java web項(xiàng)目的web.xml一樣。
plugin.xml 默認(rèn)的內(nèi)容如下:
<idea-plugin>
??<id>com.your.company.unique.plugin.idid>
??<name>Plugin display name herename>
??<version>1.0version>
??<vendor?email="[email protected]"?url="http://www.yourcompany.com">YourCompanyvendor>
??<description>??????Enter short description for your plugin here.
??????most HTML tags may be used
????]]>description>
??<change-notes>??????Add change notes here.
??????most HTML tags may be used
????]]>
??change-notes>
??
??<idea-version?since-build="145.0"/>
??
??
??<extensions?defaultExtensionNs="com.intellij">
????
??extensions>
??<actions>
????
??actions>
idea-plugin>新建一個(gè) Action
插件擴(kuò)展 IDEA 最常見的方式就是在菜單欄或者工具欄中添加菜單項(xiàng),用戶通過點(diǎn)擊菜單項(xiàng)來(lái)觸發(fā)插件功能。IDEA 提供了?AnAction?類,這個(gè)類有一個(gè)虛方法?actionPerformed,這個(gè)方法會(huì)在每次菜單被點(diǎn)擊時(shí)調(diào)用。
新建一個(gè)自定義的 Action 有兩個(gè)步驟:
1. 繼承?AnAction?類,在?actionPerformed?方法中實(shí)現(xiàn)插件邏輯
2. 注冊(cè) action,有兩種方式,通過代碼注冊(cè)和通過?plugin.xml?注冊(cè)
我們先寫一個(gè)簡(jiǎn)單的Action類:
public?class?TextBoxes?extends?AnAction?{
????// 如果通過Java代碼來(lái)注冊(cè),這個(gè)構(gòu)造函數(shù)會(huì)被調(diào)用,傳給父類的字符串會(huì)被作為菜單項(xiàng)的名稱
????// 如果你通過plugin.xml來(lái)注冊(cè),可以忽略這個(gè)構(gòu)造函數(shù)
????public?TextBoxes()?{
????????// 設(shè)置菜單項(xiàng)名稱
????????super("Text _Boxes");
????????// 還可以設(shè)置菜單項(xiàng)名稱,描述,圖標(biāo)
????????// super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png"));
????}
?
????public?void?actionPerformed(AnActionEvent event)?{
????????Project project = event.getData(PlatformDataKeys.PROJECT);
????????String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon());
????????Messages.showMessageDialog(project, "Hello, "?+ txt + "!\n I am glad to see you.", "Information", Messages.getInformationIcon());
????}
}然后我們?cè)?/span>plugin.xml中注冊(cè)這個(gè)Action:
??<group?id="MyPlugin.SampleMenu"?text="_Sample Menu"?description="Sample menu">
????<add-to-group?group-id="MainMenu"?anchor="last"??/>
???????"Myplugin.Textboxes" ?class="Mypackage.TextBoxes"?text="Text _Boxes"?description="A test menu item"?/>
??group>
這里我們新建了一個(gè)菜單組,其中 text 字符串的下劃線表示這個(gè)字母作為快捷鍵。這個(gè)菜單顯示的效果如下:

除了手動(dòng)新建Action,IDEA還提供了快速新建的方法,在代碼目錄上點(diǎn)擊新建,可以看到Action:

可以在這個(gè)面板中填寫你要新建的Action信息,IDEA會(huì)幫你新建類,還有在plugin.xml中幫你注冊(cè):

運(yùn)行插件
運(yùn)行插件特別簡(jiǎn)單,和運(yùn)行普通Java代碼一樣,點(diǎn)擊運(yùn)行或者調(diào)試的按鈕,就會(huì)啟動(dòng)一個(gè)新的IDEA實(shí)例,這個(gè)實(shí)例中插件是生效的。
點(diǎn)擊 Text Boxes 就可以看到插件的效果了。
參考資料
Setting Up a Development Environment
How to make an IntelliJ IDEA plugin in less than 30 minutes
覺得本文對(duì)你有幫助?請(qǐng)分享給更多人
關(guān)注「全棧開發(fā)者社區(qū)」加星標(biāo),提升全棧技能
本公眾號(hào)會(huì)不定期給大家發(fā)福利,包括送書、學(xué)習(xí)資源等,敬請(qǐng)期待吧!
如果感覺推送內(nèi)容不錯(cuò),不妨右下角點(diǎn)個(gè)在看轉(zhuǎn)發(fā)朋友圈或收藏,感謝支持。
好文章,留言、點(diǎn)贊、在看和分享一條龍

