天天看點

帶你走進 IntelliJ IDEA 的插件世界

作者:冰心de小屋

1. 前言

帶你走進 IntelliJ IDEA 的插件世界

工欲善其事,必先利其器!如果開發者比沙場上的戰士,那麼 IDE 就是戰士手中的兵刃,重要程度可想而知,如果 IDE 挑選合适,不僅能讓你得心應手,而且還可以事半功倍。

好的 IDE 在開發過程中會為你提供全方外的支援,例如針對于項目方面的:建立、編譯、建構和部署等,編碼方面的:關鍵字高亮、文法提示、錯誤警告、代碼自動生成和重構等,其它方面這裡不一一列舉。但是 IDE 所做的工作不僅如此,為了最大限度的發揮自身價值,提供了插件平台,允許第三方在遵循插件平台內建條款的前提下,使用插件平台對外提供的能力,擴充出更廣泛更豐富的功能。這一點上 IntelliJ IDEA 做的非常不錯,目前插件數量商業版的已經達到 3000,社群版的 2800 多,其中内容涉及了方方面面,至此插件平台不單單是一個平台,更像一個生态圈,在這個生态圈裡面 IntelliJ、第三方和開發者共赢。

說了這麼多就想告訴你一點:小小的插件,大大的用途。如果你有興趣,請跟随我的腳步一起走進 IDEA 的插件世界。

2. 插件安裝方式插件

2.1 直接通過 IDEA 内置界面安裝

帶你走進 IntelliJ 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 中必須定義插件的名稱、描述、版本以及實作的擴充功能等,下面就是插件的檔案結構:

帶你走進 IntelliJ IDEA 的插件世界

4. 插件元件

元件是插件內建的基本概念,在 IDEA 中定義了三種不同級别的元件:

4.1 Application level components:應用級别元件

IDEA 在首次啟動時會建立該執行個體,接下來不管啟動多少 IDEA 項目,都會共享唯一執行個體,可以通過 ApplicationManager.getApplication().getComponent(Class<ApplicationComponent> aClass) 擷取該執行個體。

帶你走進 IntelliJ IDEA 的插件世界

4.2 Project level components:項目級别元件

帶你走進 IntelliJ IDEA 的插件世界

啟動一個 IDEA 項目就會建立一個執行個體,項目之間不共享,子產品之間共享,可以通過目前 Project 執行個體方法:getComponent(Class<ApplicationComponent> aClass) 擷取該執行個體。

4.3 Module level components:子產品級别元件

帶你走進 IntelliJ IDEA 的插件世界

IDEA 的項目自身可能包含多個子產品,那麼項目啟動時,每個子產品會建立一個執行個體,項目之間、子產品之間不共享,可以通過 ModuleManager 根據目前 Project 執行個體擷取:ModuleManager.getInstance(project).getModules()

5. 插件擴充

IDEA 插件平台定義了擴充和擴充點的概念,通過擴充和擴充點,插件與 IDEA 之間的互動成為可能,不僅如此,還可以與其它插件進行互動。

5.1 擴充點

提供插件的同時,如果允許其它插件擴充,必須聲明擴充點,針對每個擴充點定義比對的類或接口。

5.2 平台擴充

擴充 IDEA 平台本身的功能,必須聲明一個或多個擴充。

在下面的一幅圖中我列舉了 IDEA 平台本身的擴充,僅供參考:

帶你走進 IntelliJ 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 插件的基本概念,相信開發插件絕非難事。

繼續閱讀