
作者:小傅哥 博客:https://
?沉淀、分享、成長,讓自己和他人都能有所收獲!?? ? 目錄一、前言 二、需求目的 三、環(huán)境說明 四、模板方式創(chuàng)建 1. 創(chuàng)建引導(dǎo) 2. 工程結(jié)構(gòu) 3. plugin.xml 配置 4. MyAction 事件入口 5. 運(yùn)行測試
五、Gradle 方式創(chuàng)建 1. 創(chuàng)建引導(dǎo) 2. 工程結(jié)構(gòu) 3. build.gradle 配置 4. MyAction 事件入口 5. 運(yùn)行測試
六、總結(jié) 七、系列推薦
一、前言并不是所有的不會(huì),都是真不會(huì)!
對于碼農(nóng)這一行業(yè)的編程學(xué)習(xí)生涯來說,會(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料、沒有清晰的文檔、缺少完整的案例,導(dǎo)致不知道所以不會(huì)。 正好最近在折騰IDEA插件開發(fā)的時(shí)候,市面的資料確實(shí)不多,也沒有成體系完整的開發(fā)指導(dǎo)手冊,所以就遇到了很多不知道就不會(huì)的事情,需要一點(diǎn)點(diǎn)查詢搜索源碼、驗(yàn)證API接口,最終把各項(xiàng)功能實(shí)現(xiàn),當(dāng)然在這個(gè)過程中也確實(shí)踩了不少坑! 好!沉淀下來,接下來在這個(gè)專欄會(huì)把一些關(guān)于 IDEA 插件開發(fā)用到的各項(xiàng)知識(shí)做成案例輸出出來,一方面可以讓自己縷清所有的知識(shí)項(xiàng),另一方面也可以幫助到更多的有需要的研發(fā)人員使用。 二、需求目的可能你會(huì)想什么場景會(huì)需要用到插件開發(fā),其實(shí)插件開發(fā)算是一種通用的解決方案,由服務(wù)平臺(tái)定義標(biāo)準(zhǔn)讓各自使用方進(jìn)行自需的擴(kuò)展。 這就像我們非常常用的 P3C 代碼檢查插件、代碼審計(jì)插件、腳手架工程創(chuàng)建插件、自動(dòng)化API提取插件、單元測試統(tǒng)計(jì)插件等等,這些都是在 IDEA 代碼開發(fā)平臺(tái)擴(kuò)展出來的各項(xiàng)功能插件。 插件也可以說是一種解決方案,其實(shí)與你在代碼編程時(shí)使用人家已經(jīng)定義好的標(biāo)準(zhǔn)結(jié)構(gòu)和功能下,擴(kuò)展出自己的功能時(shí)是一樣的。而這種方式也可以非常好的解決一些屬于代碼開發(fā)期間不易于放到代碼提測后問題場景,并能及時(shí)提醒研發(fā)人員作出響應(yīng)的修改處理。 三、環(huán)境說明- IntelliJ Platform Plugin JDK 不是自己安裝的JDK1.8等,只有插件JDK才能開發(fā)插件
- IntelliJ IDEA 2019.3.1 x64 如果你是其他版本,會(huì)涉及到 插件工程創(chuàng)建后版本修改
- gradle-5.2.1 與 2019 IDEA 版本下的插件開發(fā)匹配,如果遇到一些環(huán)境問題可以參考我們開篇介紹
在官方文檔 https://plugins./docs/intellij/disposers.html 介紹開發(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 插件配置:開發(fā)描述、版本信息、Action事件入口、擴(kuò)展信息(數(shù)據(jù)存放等)
- src 具體的事件、UI窗體、工程邏輯代碼開發(fā)
- 另外類似 MyAction 的創(chuàng)建并不是直接創(chuàng)建普通類,而是通過 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://">小傅哥</vendor>
<description><![CDATA[ 基于IDEA插件模板方式創(chuàng)建測試工程<br> <em>1. 學(xué)習(xí)IDEA插件工程搭建</em> <em>2. 驗(yàn)證插件基礎(chǔ)功能實(shí)現(xiàn)</em> ]]></description>
<change-notes><![CDATA[ 插件開發(fā)學(xué)習(xí)功能點(diǎn)<br> <em>1. 工程搭建</em> <em>2. 菜單讀取</em> <em>3. 獲取配置</em> <em>4. 回顯頁面</em> ]]> </change-notes>
<!-- please see http://www./intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description --> <idea-version since-build="173.0"/>
<!-- please see http://www./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 窗體中什么地方展示,以及配置快捷鍵等。這里的配置說明是在 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 文件信息,以及對應(yīng)的類路徑。
- 最后在 Messages.showMessageDialog 下打印,這樣把鼠標(biāo)放到工程類下,在點(diǎn)這個(gè)按鈕的時(shí)候就可以看到類的路徑彈窗了。
5. 運(yùn)行測試運(yùn)行過程 - 點(diǎn)擊 Plugin 綠色箭頭,和正常啟動(dòng)程序一樣
- 這個(gè)時(shí)候它會(huì)打開一個(gè)新的 IDEA 工程,并在這個(gè)工程中默認(rèn)安裝你開發(fā)好的插件
- 在新打開的 IDEA 插件工程中,選中工程類后,點(diǎn)擊 File -> MyAction
運(yùn)行結(jié)果  - 通過測試運(yùn)行效果可以看到,已經(jīng)可以打出工程下類的路徑信息了。你也可以嘗試把Action的入口放到其他按鈕下進(jìn)行測試
五、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[ 插件開發(fā)學(xué)習(xí)功能點(diǎn)<br> <em>1. 工程搭建</em> <em>2. 菜單讀取</em> <em>3. 獲取配置</em> <em>4. 回顯頁面</em> ]]>""" }
- gradle 與 maven 的使用配置上,還是可以相通的找到一些類似的地方的,如果沒有使用過 gradle 也是可以使用的。
- 這里需要注意 plugins 中
id 'org.jetbrains.intellij' version '0.6.3' 默認(rèn)創(chuàng)建工程的版本有點(diǎn)高,與 gradle 5.x 不匹配。不過你可以嘗試調(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è)插件測試,我們這里打印了工程的名稱。當(dāng)然你也可以使用 project.getName() 獲取工程名稱。
5. 運(yùn)行測試- Gradle 測試運(yùn)行相當(dāng)于是運(yùn)行
:runIde ,也是和普通的代碼調(diào)試一樣。
運(yùn)行結(jié)果  - 通過測試運(yùn)行效果可以看到,已經(jīng)可以打出工程下類的路徑信息了。
六、總結(jié)- 整篇內(nèi)容的學(xué)習(xí)還是蠻簡單的,哪怕你之前沒開發(fā)過 IDEA 插件,按照這樣的套路往下折騰也是可以完成插件開發(fā)的。類似這樣的知識(shí)內(nèi)容只是平時(shí)常做業(yè)務(wù)開發(fā)所以接觸的也不多,乍一聽上去還是很陌生的,不過有這樣的資料就可以上手了。
- 本章節(jié)初步介紹 IDEA 插件的方式和一個(gè)非常簡單的基本功能,后續(xù)我們在 Gradle 創(chuàng)建插件的基礎(chǔ)上,繼續(xù)開發(fā)其他案例功能,逐步學(xué)習(xí) IDEA 插件開發(fā)用到的各項(xiàng)技巧用于完成所需要解決的問題。
- 在學(xué)習(xí)的過程中可以自行嘗試擴(kuò)展一些其他組件入口,打印不同的工程信息。就像你使用的一些的插件一樣,幫助你生成get、set,或者提取采集接口信息,也包括你寫了多少行代碼,思考它們是如何實(shí)現(xiàn)的。
|