IntelliJ IDEA插件之開(kāi)發(fā)兩種方式創(chuàng)建插件工程
本文轉(zhuǎn)載自微信公眾號(hào)「bugstack蟲(chóng)洞?!梗髡咝「蹈?。轉(zhuǎn)載本文請(qǐng)聯(lián)系bugstack蟲(chóng)洞棧公眾號(hào)。
一、前言
并不是所有的不會(huì),都是真不會(huì)!
對(duì)于碼農(nóng)這一行業(yè)的編程學(xué)習(xí)生涯來(lái)說(shuō),會(huì)遇到很多的不會(huì),不會(huì)搭建IDEA工程、不會(huì)寫老師的案例、不會(huì)完成書中的效果、不會(huì)做項(xiàng)目的需求、不會(huì)實(shí)現(xiàn)復(fù)雜的邏輯、不會(huì)抽象工程的結(jié)構(gòu)等等。但這些不會(huì)當(dāng)中并不是所有的不會(huì),都因?yàn)樘珡?fù)雜學(xué)不會(huì),而是很大一部分內(nèi)容因?yàn)檎也坏胶玫馁Y料、沒(méi)有清晰的文檔、缺少完整的案例,導(dǎo)致不知道所以不會(huì)。
正好最近在折騰IDEA插件開(kāi)發(fā)的時(shí)候,市面的資料確實(shí)不多,也沒(méi)有成體系完整的開(kāi)發(fā)指導(dǎo)手冊(cè),所以就遇到了很多不知道就不會(huì)的事情,需要一點(diǎn)點(diǎn)查詢搜索源碼、驗(yàn)證API接口,最終把各項(xiàng)功能實(shí)現(xiàn),當(dāng)然在這個(gè)過(guò)程中也確實(shí)踩了不少坑!
好!沉淀下來(lái),接下來(lái)在這個(gè)專欄會(huì)把一些關(guān)于 IDEA 插件開(kāi)發(fā)用到的各項(xiàng)知識(shí)做成案例輸出出來(lái),一方面可以讓自己縷清所有的知識(shí)項(xiàng),另一方面也可以幫助到更多的有需要的研發(fā)人員使用。
二、需求目的
可能你會(huì)想什么場(chǎng)景會(huì)需要用到插件開(kāi)發(fā),其實(shí)插件開(kāi)發(fā)算是一種通用的解決方案,由服務(wù)平臺(tái)定義標(biāo)準(zhǔn)讓各自使用方進(jìn)行自需的擴(kuò)展。
這就像我們非常常用的 P3C 代碼檢查插件、代碼審計(jì)插件、腳手架工程創(chuàng)建插件、自動(dòng)化API提取插件、單元測(cè)試統(tǒng)計(jì)插件等等,這些都是在 IDEA 代碼開(kāi)發(fā)平臺(tái)擴(kuò)展出來(lái)的各項(xiàng)功能插件。
插件也可以說(shuō)是一種解決方案,其實(shí)與你在代碼編程時(shí)使用人家已經(jīng)定義好的標(biāo)準(zhǔn)結(jié)構(gòu)和功能下,擴(kuò)展出自己的功能時(shí)是一樣的。而這種方式也可以非常好的解決一些屬于代碼開(kāi)發(fā)期間不易于放到代碼提測(cè)后問(wèn)題場(chǎng)景,并能及時(shí)提醒研發(fā)人員作出響應(yīng)的修改處理。
三、環(huán)境說(shuō)明
- IntelliJ Platform Plugin JDK 不是自己安裝的JDK1.8等,只有插件JDK才能開(kāi)發(fā)插件
- IntelliJ IDEA 2019.3.1 x64 如果你是其他版本,會(huì)涉及到 插件工程創(chuàng)建后版本修改
- gradle-5.2.1 與 2019 IDEA 版本下的插件開(kāi)發(fā)匹配,如果遇到一些環(huán)境問(wèn)題可以參考我們開(kāi)篇介紹
在官方文檔 https://plugins.jetbrains.com/docs/intellij/disposers.html 介紹開(kāi)發(fā) IDEA 插件的工程方式有兩種,分別是模板方式和 Gradle 工程方式。這里我們分別演示下不同方式下工程的創(chuàng)建和所涉及到知識(shí)點(diǎn)內(nèi)容的介紹,雖然兩種方式都能創(chuàng)建 IDEA 插件工程,但更推薦使用 Gradle 方式。
四、模板方式創(chuàng)建
1. 創(chuàng)建引導(dǎo)
- New -> Project -> IntelliJ Platform Plugin
2. 工程結(jié)構(gòu)
guide-idea-plugin-create-project-by-platform
├── resources
│ └── META-INF
│ └── plugin.xml
└── src
└── cn.bugstack.guide.idea.plugin
└── MyAction.java
源碼:https://github.com/fuzhengwei/guide-idea-plugin-create-project-by-platform
- plugin.xml 插件配置:開(kāi)發(fā)描述、版本信息、Action事件入口、擴(kuò)展信息(數(shù)據(jù)存放等)
- src 具體的事件、UI窗體、工程邏輯代碼開(kāi)發(fā)
- 另外類似 MyAction 的創(chuàng)建并不是直接創(chuàng)建普通類,而是通過(guò) New -> Plugin DevKit -> Action 的方式進(jìn)行創(chuàng)建,因?yàn)檫@樣的創(chuàng)建方式可以在 plugin.xml 中自動(dòng)添加 action 配置。當(dāng)然如果你要是自己手動(dòng)創(chuàng)建普通類那樣創(chuàng)建 Action 類,則需要自己手動(dòng)處理配置信息。
3. plugin.xml 配置
- <idea-plugin>
- <id>cn.bugstack.guide.idea.plugin</id>
- <name>CreateProjectByPlatform</name>
- <version>1.0</version>
- <vendor email="184172133@qq.com" url="https://bugstack.cn">小傅哥</vendor>
- <description><![CDATA[
- 基于IDEA插件模板方式創(chuàng)建測(cè)試工程<br>
- <em>1. 學(xué)習(xí)IDEA插件工程搭建</em>
- <em>2. 驗(yàn)證插件基礎(chǔ)功能實(shí)現(xiàn)</em>
- ]]></description>
- <change-notes><![CDATA[
- 插件開(kāi)發(fā)學(xué)習(xí)功能點(diǎn)<br>
- <em>1. 工程搭建</em>
- <em>2. 菜單讀取</em>
- <em>3. 獲取配置</em>
- <em>4. 回顯頁(yè)面</em>
- ]]>
- </change-notes>
- <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
- <idea-version since-build="173.0"/>
- <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
- on how to target different products -->
- <depends>com.intellij.modules.platform</depends>
- <extensions defaultExtensionNs="com.intellij">
- <!-- Add your extensions here -->
- </extensions>
- <actions>
- <!-- Add your actions here -->
- <action id="MyAction" class="cn.bugstack.guide.idea.plugin.MyAction" text="MyAction" description="MyAction">
- <add-to-group group-id="FileMenu" anchor="first"/>
- </action>
- </actions>
- </idea-plugin>
這里重點(diǎn)看 actions 其他上面的工程信息、版本描述、個(gè)人資料都按照自己的信息填寫就行,不會(huì)影響插件運(yùn)行。
actions 下是關(guān)于所有事件入口的配置,也就是你希望讓你的 IDEA 插件在 IDEA 窗體中什么地方展示,以及配置快捷鍵等。這里的配置說(shuō)明是在 FileMenu 下的第一個(gè)入口即為你的插件。
4. MyAction 事件入口
- public class MyAction extends AnAction {
- @Override
- public void actionPerformed(AnActionEvent e) {
- Project project = e.getData(PlatformDataKeys.PROJECT);
- PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
- String classPath = psiFile.getVirtualFile().getPath();
- Messages.showMessageDialog(project, "guide-idea-plugin-create-project-by-platform: " + classPath, "Hi IDEA Plugin", Messages.getInformationIcon());
- }
- }
- 在 MyAction 事件入口中獲取 Project 工程信息、PsiFile 文件信息,以及對(duì)應(yīng)的類路徑。
- 最后在 Messages.showMessageDialog 下打印,這樣把鼠標(biāo)放到工程類下,在點(diǎn)這個(gè)按鈕的時(shí)候就可以看到類的路徑彈窗了。
5. 運(yùn)行測(cè)試
運(yùn)行過(guò)程
- 點(diǎn)擊 Plugin 綠色箭頭,和正常啟動(dòng)程序一樣
- 這個(gè)時(shí)候它會(huì)打開(kāi)一個(gè)新的 IDEA 工程,并在這個(gè)工程中默認(rèn)安裝你開(kāi)發(fā)好的插件
- 在新打開(kāi)的 IDEA 插件工程中,選中工程類后,點(diǎn)擊 File -> MyAction
運(yùn)行結(jié)果
通過(guò)測(cè)試運(yùn)行效果可以看到,已經(jīng)可以打出工程下類的路徑信息了。你也可以嘗試把Action的入口放到其他按鈕下進(jìn)行測(cè)試
五、Gradle 方式創(chuàng)建
1. 創(chuàng)建引導(dǎo)
New -> Project -> Gradle 選中 Java & IntelliJ Platform Plugin
2. 工程結(jié)構(gòu)
- guide-idea-plugin-create-project-by-gradle
- ├── .gradle
- └── src
- ├── main
- │ └── java
- │ └── cn.bugstack.guide.idea.plugin
- │ └── MyAction.java
- ├── resources
- │ └── META-INF
- │ └── plugin.xml
- ├── build.gradle
- └── gradle.properties
源碼:https://github.com/fuzhengwei/guide-idea-plugin-create-project-by-gradle
- 與模板方式創(chuàng)建 Gradle 主要差異在 build.gradle、gradle.properties 內(nèi)容的配置,這兩個(gè)文件主要是處理 Gradle 相關(guān)信息的,其中 gradle.properties 用于配置 JVM Xmx 參數(shù)的,避免下載耗費(fèi)資源較大崩潰。
- plugin.xml 配置插件入口等內(nèi)容,MyAction 是事件入口。
3. build.gradle 配置
- plugins {
- id 'java'
- id 'org.jetbrains.intellij' version '0.6.3'
- }
- group 'cn.bugstack.guide.idea.plugin'
- version '1.0-SNAPSHOT'
- sourceCompatibility = 1.8
- repositories {
- mavenCentral()
- }
- dependencies {
- testCompile group: 'junit', name: 'junit', version: '4.12'
- }
- // See https://github.com/JetBrains/gradle-intellij-plugin/
- intellij {
- version '2019.3.1'
- }
- patchPluginXml {
- changeNotes """
- <![CDATA[
- 插件開(kāi)發(fā)學(xué)習(xí)功能點(diǎn)<br>
- <em>1. 工程搭建</em>
- <em>2. 菜單讀取</em>
- <em>3. 獲取配置</em>
- <em>4. 回顯頁(yè)面</em>
- ]]>"""
- }
gradle 與 maven 的使用配置上,還是可以相通的找到一些類似的地方的,如果沒(méi)有使用過(guò) gradle 也是可以使用的。
這里需要注意 plugins 中 id 'org.jetbrains.intellij' version '0.6.3' 默認(rèn)創(chuàng)建工程的版本有點(diǎn)高,與 gradle 5.x 不匹配。不過(guò)你可以嘗試調(diào)試合適版本進(jìn)行使用
4. MyAction 事件入口
- public class MyAction extends AnAction {
- @Override
- public void actionPerformed(AnActionEvent e) {
- Project project = e.getData(PlatformDataKeys.PROJECT);
- PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
- String classPath = psiFile.getVirtualFile().getPath();
- Messages.showMessageDialog(project, "guide-idea-plugin-create-project-by-gradle: " + classPath, "Hi IDEA Plugin", Messages.getInformationIcon());
- }
- }
這里與模板方式創(chuàng)建的案例是一樣的,為了區(qū)別兩個(gè)插件測(cè)試,我們這里打印了工程的名稱。當(dāng)然你也可以使用 project.getName() 獲取工程名稱。
5. 運(yùn)行測(cè)試
Gradle 測(cè)試運(yùn)行相當(dāng)于是運(yùn)行 :runIde ,也是和普通的代碼調(diào)試一樣。
運(yùn)行結(jié)果
通過(guò)測(cè)試運(yùn)行效果可以看到,已經(jīng)可以打出工程下類的路徑信息了。
六、總結(jié)
整篇內(nèi)容的學(xué)習(xí)還是蠻簡(jiǎn)單的,哪怕你之前沒(méi)開(kāi)發(fā)過(guò) IDEA 插件,按照這樣的套路往下折騰也是可以完成插件開(kāi)發(fā)的。類似這樣的知識(shí)內(nèi)容只是平時(shí)常做業(yè)務(wù)開(kāi)發(fā)所以接觸的也不多,乍一聽(tīng)上去還是很陌生的,不過(guò)有這樣的資料就可以上手了。
本章節(jié)初步介紹 IDEA 插件的方式和一個(gè)非常簡(jiǎn)單的基本功能,后續(xù)我們?cè)?Gradle 創(chuàng)建插件的基礎(chǔ)上,繼續(xù)開(kāi)發(fā)其他案例功能,逐步學(xué)習(xí) IDEA 插件開(kāi)發(fā)用到的各項(xiàng)技巧用于完成所需要解決的問(wèn)題。
在學(xué)習(xí)的過(guò)程中可以自行嘗試擴(kuò)展一些其他組件入口,打印不同的工程信息。就像你使用的一些的插件一樣,幫助你生成get、set,或者提取采集接口信息,也包括你寫了多少行代碼,思考它們是如何實(shí)現(xiàn)的。