1. 前言
工欲善其事,必先利其器!如果開發者比沙場上的戰士,那麼 IDE 就是戰士手中的兵刃,重要程度可想而知,如果 IDE 挑選合适,不僅能讓你得心應手,而且還可以事半功倍。
好的 IDE 在開發過程中會為你提供全方外的支援,例如針對于項目方面的:建立、編譯、建構和部署等,編碼方面的:關鍵字高亮、文法提示、錯誤警告、代碼自動生成和重構等,其它方面這裡不一一列舉。但是 IDE 所做的工作不僅如此,為了最大限度的發揮自身價值,提供了插件平台,允許第三方在遵循插件平台內建條款的前提下,使用插件平台對外提供的能力,擴充出更廣泛更豐富的功能。這一點上 IntelliJ IDEA 做的非常不錯,目前插件數量商業版的已經達到 3000,社群版的 2800 多,其中内容涉及了方方面面,至此插件平台不單單是一個平台,更像一個生态圈,在這個生态圈裡面 IntelliJ、第三方和開發者共赢。
說了這麼多就想告訴你一點:小小的插件,大大的用途。如果你有興趣,請跟随我的腳步一起走進 IDEA 的插件世界。
2. 插件安裝方式插件
2.1 直接通過 IDEA 内置界面安裝
2.2 安裝本地已下載下傳的 IDEA 插件
通過 IDEA 的官網插件位址:https://plugins.jetbrains.com/ 下載下傳 zip 格式的插件檔案到本地,之後通過 Preference > Plugins > Install plugin form disk 安裝。
成功安裝插件後,需要重新開機 IDEA。
3. 插件檔案結構
插件的檔案格式是 zip,zip 内必須包含插件配置檔案 META-INF/plugin.xml,在 plugin.xml 中必須定義插件的名稱、描述、版本以及實作的擴充功能等,下面就是插件的檔案結構:
4. 插件元件
元件是插件內建的基本概念,在 IDEA 中定義了三種不同級别的元件:
4.1 Application level components:應用級别元件
IDEA 在首次啟動時會建立該執行個體,接下來不管啟動多少 IDEA 項目,都會共享唯一執行個體,可以通過 ApplicationManager.getApplication().getComponent(Class<ApplicationComponent> aClass) 擷取該執行個體。
4.2 Project level components:項目級别元件
啟動一個 IDEA 項目就會建立一個執行個體,項目之間不共享,子產品之間共享,可以通過目前 Project 執行個體方法:getComponent(Class<ApplicationComponent> aClass) 擷取該執行個體。
4.3 Module level components:子產品級别元件
IDEA 的項目自身可能包含多個子產品,那麼項目啟動時,每個子產品會建立一個執行個體,項目之間、子產品之間不共享,可以通過 ModuleManager 根據目前 Project 執行個體擷取:ModuleManager.getInstance(project).getModules()
5. 插件擴充
IDEA 插件平台定義了擴充和擴充點的概念,通過擴充和擴充點,插件與 IDEA 之間的互動成為可能,不僅如此,還可以與其它插件進行互動。
5.1 擴充點
提供插件的同時,如果允許其它插件擴充,必須聲明擴充點,針對每個擴充點定義比對的類或接口。
5.2 平台擴充
擴充 IDEA 平台本身的功能,必須聲明一個或多個擴充。
在下面的一幅圖中我列舉了 IDEA 平台本身的擴充,僅供參考:
6. 插件動作
ActionIDEA 中菜單欄項目的選擇或工具欄按鈕的點選,會通過指令模式建立 AnAction 派生類的執行個體,之後調用派生執行個體的 actionPerformed 方法。通過 Action 系統你還可以擴充 IDEA 的主菜單、項目菜單、編輯器菜單和工具欄,将插件功能加入其中。
7. 插件配置檔案
plugin.xmlplugin.xml 是插件最核心的内容,通過下面的示例說明,你可以了解到 plugin.xml 涉及到的所有層級元素:
<idea-plugin url="http://www.jetbrains.com/idea">
<!-- 為你的插件設計一個響亮的名字 -->
<name>VssIntegration</name>
<!-- 插件的唯一辨別,一經建立,永不更改,如為空則依據 name 字段 -->
<id>VssIntegration</id>
<!-- 你應該描述下插件具體的功能 -->
<description>Vss integration plugin</description>
<!-- 插件随着版本的不斷更新的過程中,所做的更改清單 -->
<change-notes>Initial release of the plugin.</change-notes>
<!-- 插件版本 -->
<version>1.0</version>
<!-- 插件的開發者資訊 -->
<vendor url="錯誤! 超連結引用無效。 email="[email protected]">[email protected]"/>
<!-- 依賴插件的唯一辨別 -->
<depends>MyFirstPlugin</depends>
<!-- 可選擇的依賴其它插件辨別 -->
<depends optional="true" config-file="mysecondplugin.xml">MySecondPlugin</depends>
<!-- 幫助系統支援 -->
<helpset file="myhelp.jar" path="/Help.hs"/>
<!-- 插件适用于 IDEA 的版本區間 -->
<idea-version since-build="3000" until-build="3999"/>
<!-- 插件多語支援 -->
<resource-bundle>messages.MyPluginBundle</resource-bundle>
<!-- 應用級别元件聲明 -->
<application-components>
<component>
<interface-class>com.foo.Component1Interface</interface-class>
<implementation-class>com.foo.impl.Component1Impl</implementation-class>
</component>
</application-components>
<!-- 項目級别元件聲明 -->
<project-components>
<component>
<interface-class>com.foo.Component2</interface-class>
<implementation-class>com.foo.Component2Impl</implementation-class>
<option name="workspace" value="true"/>
<loadForDefaultProject/>
</component>
</project-components>
<!-- 子產品級别元件聲明 module components -->
<module-components>
<component>
<interface-class>com.foo.Component3</interface-class>
<implementation-class>com.foo.Component3Impl</implementation-class>
</component>
</module-components>
<!-- 動作 -->
<actions>
<action id="VssIntegration.GarbageCollection" class="com.foo.impl.CollectGarbage" text="Collect _Garbage"
description="Run garbage collector">
<keyboard-shortcut first-keystroke="control alt G" second-keystroke="C" keymap="$default"/>
</action>
</actions>
<!-- 擴充點聲明 -->
<extensionPoints>
<extensionPoint name="testExtensionPoint" beanClass="com.foo.impl.MyExtensionBean"/>
</extensionPoints>
<!-- 擴充聲明 -->
<extensions xmlns="VssIntegration">
<testExtensionPoint implementation="com.foo.impl.MyExtensionImpl"/>
</extensions>
</idea-plugin>
複制代碼
8. 插件實踐
已經開發了幾款插件:
- TalkingData ORM Tool:根據選擇的資料庫,比對資料庫中的所有表,自動生成 domain 類、dao 接口和 mapping 檔案。
- TalkingData Jira Integration:友善開發者更好的使用 Jira 進行靈活開發的工作。
- My Favorite Code:無論何時何地,收藏精彩的代碼片段。
9. 後續
在接下來的章節中會介紹:快速的開發 IDEA 插件,如果你已經仔細的閱讀上面的内容,熟知 IDEA 插件的基本概念,相信開發插件絕非難事。