技術(shù)調(diào)研,IDEA 插件怎么開發(fā)「腳手架、低代碼可視化編排、接口生成測(cè)試」?
目錄
一、前言
二、拋出問(wèn)題
三、開發(fā)插件涉及的問(wèn)題
四、開發(fā)插件的兩種配置
1. 基礎(chǔ)配置
2. 遇到問(wèn)題
五、寫個(gè)測(cè)試案例
1. 工程結(jié)構(gòu)
2. AnAction
3. MyToolWindowFactory
4. plugin.xml
5. 測(cè)試結(jié)果
六、插件開發(fā)能做啥都
1. 快速生成 CRUD 工程代碼
2. 在 IDEA 中摸魚聊天
3. 可視化流程編排
七、總結(jié)
一、前言
不踩些坑,根本不是成熟的碼農(nóng)!
你覺(jué)得肯德基全家桶是什么?一家人一起吃的桶嗎,就那么一點(diǎn)點(diǎn)?不是,肯德基全家桶說(shuō)的是,雞的全家桶!
聽(tīng)到這個(gè)故事就像有時(shí)候我因?yàn)樾枰鉀Q某些問(wèn)題去搜索、折騰、驗(yàn)證、排除的技術(shù)方案,因?yàn)榉较虿粚?duì),所以努力也就白費(fèi)。只能一次次在眾多的資料、文檔、源碼中一點(diǎn)點(diǎn)找到并組合出適合自己的問(wèn)題場(chǎng)景的技術(shù)處理手段。
但這個(gè)過(guò)程有時(shí)候又是必須經(jīng)歷的,很少有時(shí)候能一次就找到正確的答案或者人,哪怕開始就找到了,也會(huì)再去排查下其他的資料,看看還有沒(méi)有更好的。是不,這就是你吧?
二、拋出問(wèn)題
我又要沖IDEA插件開發(fā)了!
在研究字節(jié)碼插樁的相關(guān)技術(shù)后,??考慮著除了通常的用在代碼上線后的非入侵式監(jiān)控外,是不是也可以用于研發(fā)在開發(fā)階段對(duì)系統(tǒng)接口的提取呢?
帶著這個(gè)從腦袋中冒出的想法,想到如果要處理這個(gè)事情,最核心的問(wèn)題就是開發(fā)一款I(lǐng)DEA插件+字節(jié)碼插樁能力,在代碼運(yùn)行時(shí)對(duì)運(yùn)行方法增強(qiáng),提取相關(guān)的必要信息。別說(shuō)案例還真做出來(lái)了,如下:
- 案例地址:基于IDEA插件開發(fā)和字節(jié)碼插樁技術(shù),實(shí)現(xiàn)研發(fā)交付質(zhì)量自動(dòng)分析
- 后續(xù)問(wèn)題:其實(shí)實(shí)現(xiàn)到這里還只能算是一個(gè)案例,對(duì)于 IDEA 插件開發(fā)能力并沒(méi)有完全弄透,比如這個(gè) IDEA 插件需要做一些基礎(chǔ)配置,那么在哪里打開呢?還有實(shí)時(shí)監(jiān)控并產(chǎn)生的接口信息能在 IDEA 界面右側(cè)展示出來(lái)或者支持導(dǎo)出嗎?如果我再有一些集合 IDEA 插件開發(fā)的能力做的其他的功能引入咋辦呢?這里用到了哪些技術(shù)呢?等等,這些問(wèn)題都需要去一一解決掉,才能完完整整的開發(fā)一個(gè)可用的 IDEA 插件,為此,需要做更深入的資料整理和實(shí)踐驗(yàn)證。
三、開發(fā)插件涉及的問(wèn)題
問(wèn)題匯總:開發(fā)一個(gè) IDEA 插件基本要涉及到的問(wèn)題過(guò)程如下:
- 開發(fā)方式:在官網(wǎng)的描述中,創(chuàng)建IDEA插件工程的方式有兩種分別是,IntelliJ Platform Plugin 模版創(chuàng)建和 Gradle 構(gòu)建方式。
- 框架入口:一個(gè) IDEA 插件開發(fā)完,要考慮把它嵌入到哪,比如是從 IDEA 窗體的 Edit、Tools 等進(jìn)入配置還是把窗體嵌入到左、右工具條還是IDEA窗體下的對(duì)話框。
- UI:思考的是窗體需要用到什么語(yǔ)言開發(fā),沒(méi)錯(cuò),用的就是 Swing、Awt 的技術(shù)能力。
- API:在 IDEA 插件開發(fā)中,一般都是圍繞工程進(jìn)行的,那么基本要從通過(guò) IDEA 插件 JDK 開發(fā)能力中獲取到工程信息、類信息、文件信息等。
- 外部功能:這一個(gè)是用于把插件能力與外部系統(tǒng)結(jié)合,比如你是需要把拿到的接口上傳到服務(wù)器,還是從遠(yuǎn)程下載文件等等。
四、開發(fā)插件的兩種配置
- 官方文檔:https://plugins.jetbrains.com/docs/intellij/disposers.html
- 官方案例:https://github.com/JetBrains/intellij-sdk-docs
1. 基礎(chǔ)配置
- IntelliJ IDEA 2019.3.1 x64
- JDK 需要配置 IntelliJ Platform Plugin JDK,在 Project Setting 中設(shè)置,這樣才可以正常開發(fā) IDEA 插件
- id 'org.jetbrains.intellij' version '0.6.3'
- gradle-5.2.1 與 2019 IDEA 版本下的插件開發(fā)匹配
- Settings -> Build, Execution,Deloyment -> Build Tools,配置 Gradle。Gradle user home = D:/Program Files (x86)/gradle/gradle-5.2.1/.gradle User Gradle from =gradle-wrapper.properties 或者 Specified location 具體如下圖:
如果你是使用 IDEA New Project 默認(rèn)的 IntelliJ Platform Plugin 方式,其實(shí)只關(guān)注1、2兩步驟就可以了,但如果你需要 Gradle,那么需要注意3、4、5步驟的設(shè)置。當(dāng)然通常也更推薦使用 Gradle 來(lái)搭建工程,這樣你在需要一些額外的 Jar 包時(shí)候,只需要在 Gradle build.gradle 配置即可,而不是把需要的 Jar 包復(fù)制到工程的 lib 下。
2. 遇到問(wèn)題
在使用 Gradle 構(gòu)建項(xiàng)目后,你會(huì)遇到幾個(gè)問(wèn)題;
- 提前下載好 Gradle 5.2.1 版本并配置上,否則構(gòu)建工程自動(dòng)下載會(huì)比較慢 https://gradle.org/next-steps/?version=5.2.1&format=all
- 構(gòu)建工程時(shí)候拉取相關(guān)內(nèi)容,會(huì)比較慢,如果你有代理會(huì)好一些。
- 【麻煩的問(wèn)題】基于 Gradle 的 IDEA 插件開發(fā)會(huì)在構(gòu)建過(guò)程中,會(huì)下載一個(gè)匹配版本的 IDEA 軟件用于啟動(dòng)測(cè)試開發(fā)插件,幾百兆那種zip包 ideaIC-2019.3.1.zip。這個(gè)時(shí)候基本你會(huì)遇到一個(gè)崩潰的報(bào)錯(cuò) Could not resolve all files for configuration ':detachedConfiguration1'. 咋辦呢,如果你不嫌棄麻煩可以手動(dòng)下載并SHA1加密后把下載的文件放到緩存文件夾中 .gradle\caches\modules-2\files-2.1 具體操作如下:
- 打開系統(tǒng)盤下當(dāng)前用戶的.gradle目錄,進(jìn)入.gradle\caches\modules-2\files-2.1目錄,即為緩存文件的目錄。這個(gè)目錄是你的報(bào)錯(cuò)構(gòu)建過(guò)程中的報(bào)錯(cuò)地址,Could not get resource D:\Program Files (x86)\gradle\gradle-5.2.1\.gradle\caches\modules-2\files-2.1\com.jetbrains.intellij.idea\ideaIC\2019.3.1
- 加密文件夾2dae8e50d4b0508cad2e680b53414f657954f390目錄名稱(你的可能不是這樣的),我去,這個(gè)應(yīng)該是加密過(guò)的,但是是什么加密呢?,經(jīng)過(guò)了解知道了這個(gè)是SHA1加密,且是對(duì)文件進(jìn)行SHA1的加密生成的唯一字符串,但是windows上沒(méi)有這個(gè)命令,在線SHA1也太麻煩了,還要上傳文件,于是想到了Java的API,還有就是通過(guò)git hash命令行來(lái)實(shí)現(xiàn)。把我們的文件ideaIC-2019.3.1.zip先臨時(shí)拷貝到這個(gè)目錄。運(yùn)行sha1sum.exe ideaIC-2019.3.1.zip命令,生成唯一的唯一字符串(用來(lái)校驗(yàn)文件的完整性),這樣就拿到這個(gè)2dae8e50d4b0508cad2e680b53414f657954f390目錄名
- 接下來(lái)在2019.3.1目錄下,新建目錄2dae8e50d4b0508cad2e680b53414f657954f390,將ideaIC-2019.3.1.zip移動(dòng)進(jìn)去即可。
- 【堆棧溢出】在 Gradle 構(gòu)建的過(guò)程中,消耗內(nèi)存較大,可能會(huì)報(bào)錯(cuò) Java heap space 所以也可以 在IDEA項(xiàng)目根目錄下,新建文件gradle.properties,添加如下內(nèi)容,變更gradle Jvm參數(shù) org.gradle.jvmargs=-Xmx2024m -XX:MaxPermSize=512m 別說(shuō)還挺好用,竟然構(gòu)建成功了。
五、寫個(gè)測(cè)試案例
1. 工程結(jié)構(gòu)
- PluginGuide
- ├── .gradle
- └── src
- ├── main
- │ └── java
- │ ├── HiClazz.java
- │ ├── MyDumbAwareAction.java
- │ ├── MySearchableConfigurable.java
- │ ├── MyToolWindowFactory.java
- │ └── TestUI.java
- └── resources
- ├── icons
- └── META-INF
- └── plugin.xml
- HiClazz 是繼承 AnAction 的實(shí)現(xiàn)類,用于附著到 IDEA 的窗體上,點(diǎn)擊后打開對(duì)應(yīng)頁(yè)面
- MyDumbAwareAction、MyToolWindowFactory,配合使用,用于在 IDEA 最下面的窗體設(shè)置,與你看見(jiàn)的控制臺(tái)輸出信息位置一樣。
- MySearchableConfigurable,可以用于 Settings 中配置窗體。
- TestUI 是基于 Swing 開發(fā)的窗體,驗(yàn)證在 AnAction 實(shí)現(xiàn)類中打開。
- plugin.xml 是整個(gè) IDEA 咖啡的配置文件,你所有的窗體都會(huì)在這個(gè)配置文件里有所體現(xiàn)。
2. AnAction
- public class HiClazz 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();
- String title = "Hello World!";
- Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon());
- }
- }
測(cè)試在 IDEA 中讀取鼠標(biāo)停留在類文件中的信息。我們可以把這個(gè) AnAction 配置到各個(gè) IDEA 菜單中。
3. MyToolWindowFactory
- public class MyToolWindowFactory implements ToolWindowFactory {
- @Override
- public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
- toolWindow.setToHideOnEmptyContent(true);
- class MyPanel extends SimpleToolWindowPanel {
- public MyPanel(boolean vertical) {
- super(vertical);
- DefaultActionGroup group = new DefaultActionGroup();
- group.add(new MyDumbAwareAction("Login1"));
- group.add(new MyDumbAwareAction("Login2"));
- group.add(new MyDumbAwareAction("Login3"));
- ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("ToolBar", group, false);
- setToolbar(toolbar.getComponent());
- }
- }
- // 添加一個(gè)頁(yè)
- toolWindow.getContentManager().addContent(ContentFactory.SERVICE.getInstance().createContent(new MyPanel(false), "First", false), 0);
- }
- }
- 在 IDEA 的最下面窗體中,如果想展示自己的窗體,則需要開發(fā)對(duì)應(yīng)的 ToolWindowFactory 實(shí)現(xiàn)類,這樣才可以展示你的內(nèi)容。
- 這里的思想基本是 Swing 技術(shù)的開發(fā)方式,如果你不熟悉 Swing 最這塊內(nèi)容會(huì)比較陌生。
4. plugin.xml
- <extensions defaultExtensionNs="com.intellij">
- <!-- Add your extensions here -->
- <toolWindow canCloseContents="true" anchor="bottom"
- id="SmartIM"
- factoryClass="MyToolWindowFactory">
- </toolWindow>
- <!-- 在Setting中添加自定義配置模版 -->
- <projectConfigurable groupId="Other Settings" displayName="My Config" id="thief.id"
- instance="MySearchableConfigurable"/>
- </extensions>
- <actions>
- <!-- Add your actions here -->
- <action id="HiId_FileMenu" class="HiClazz" text="HiName">
- <add-to-group group-id="FileMenu" anchor="first"/>
- <add-to-group group-id="MainMenu" anchor="first"/>
- <add-to-group group-id="EditMenu" anchor="first"/>
- <add-to-group group-id="ViewMenu" anchor="first"/>
- <add-to-group group-id="CodeMenu" anchor="first"/>
- <add-to-group group-id="AnalyzeMenu" anchor="first"/>
- <add-to-group group-id="RefactoringMenu" anchor="first"/>
- <add-to-group group-id="BuildMenu" anchor="first"/>
- <add-to-group group-id="RunMenu" anchor="first"/>
- <add-to-group group-id="ToolsMenu" anchor="first"/>
- <add-to-group group-id="WindowMenu" anchor="first"/>
- <add-to-group group-id="HelpMenu" anchor="first"/>
- </action>
- <action id="HiId_EditorPopupMenu" class="HiClazz" text="HiName">
- <add-to-group group-id="EditorPopupMenu" anchor="first"/>
- </action>
- <action id="HiId_MainToolBar" class="HiClazz" text="HiName">
- <add-to-group group-id="MainToolBar" anchor="first"/>
- </action>
- </actions>
在 plugin.xml 的配置中,主要是把各個(gè)功能實(shí)現(xiàn)窗體配置到對(duì)應(yīng)的菜單下,比如 Tools 下、toolWindow 里等。
5. 測(cè)試結(jié)果
啟動(dòng)運(yùn)行
- IDEA 插件開發(fā)運(yùn)行會(huì)基于 Plugin 或者 Gradle 下配置的 ::runIde
運(yùn)行界面
- 在 IDEA 的各個(gè)菜單中都可以看到新增加的 HiName 插件,在你實(shí)際開發(fā)的時(shí)候選擇需要的內(nèi)容進(jìn)行配置即可。
運(yùn)行效果
當(dāng)鼠標(biāo)點(diǎn)到類的上,在點(diǎn) HiName 就可以看到對(duì)應(yīng)的工程類信息了。
六、插件開發(fā)能做啥都
在 GitHub 上搜索 IDEA 插件開發(fā),一共有44頁(yè)內(nèi)容,https://github.com/search?p=41&q=idea%E6%8F%92%E4%BB%B6&type=Repositories 涉及到自動(dòng)化測(cè)試、工程腳手架、API生成、生成數(shù)據(jù)庫(kù)的DAO類、一些常用工具,當(dāng)然還有一些比較有意思的,比如:摸魚看書、聽(tīng)郭德綱相聲、微信聊天、局域網(wǎng)聊天、英語(yǔ)翻譯等等。這里我給大家列舉幾個(gè),開闊開闊思路。
1. 快速生成 CRUD 工程代碼
- 地址:https://github.com/mars05/crud-intellij-plugin
- 描述:一個(gè)增刪改查的idea插件,可以根據(jù)數(shù)據(jù)庫(kù)表結(jié)構(gòu),幫助您快速生成model、dao、service、controller等相關(guān)代碼。同時(shí)支持MyBatis、JPA、MybatisPlus。
2. 在 IDEA 中摸魚聊天
地址:https://github.com/Jamling/SmartIM4IntelliJ
描述:ntelliJ IDEA上的SmartIM(原SmartQQ)插件,可以在IDEA中使用QQ或微信聊天。安裝成功后,會(huì)在底部欄出現(xiàn)一個(gè)SmartIM的tab(如果沒(méi)有底部欄,則在菜單View中把ToolButtons勾選上)
3. 可視化流程編排
- 地址:https://github.com/alibaba/compileflow
- 描述:compileflow Process引擎是淘寶工作流TBBPM引擎之一,是專注于純內(nèi)存執(zhí)行,無(wú)狀態(tài)的流程引擎,通過(guò)將流程文件轉(zhuǎn)換生成java代碼編譯執(zhí)行,簡(jiǎn)潔高效。當(dāng)前是阿里業(yè)務(wù)中臺(tái)交易等多個(gè)核心系統(tǒng)的流程引擎。在阿里巴巴中臺(tái)解決方案中廣泛使用,支撐了導(dǎo)購(gòu)、交易、履約、資金等多個(gè)業(yè)務(wù)場(chǎng)景。
七、總結(jié)
IDEA 開發(fā)技術(shù)涉及到了對(duì) IDEA 插件開發(fā) API 的熟悉以及UI界面的開發(fā),所以如果想開發(fā)一款 IDEA 插件,基本離不開對(duì) Swing 的編寫,不過(guò)也不需要太復(fù)雜的頁(yè)面,所有這部分技能還好。
IDEA 官網(wǎng)文檔僅提供了兩種構(gòu)建 IDEA 插件工程的方法,但更推薦 Gradle 方式,這樣可以滿足你對(duì)后續(xù)其他功能組件的便捷引入,以及做其他內(nèi)容的擴(kuò)展。
IDEA 插件開發(fā)可以開發(fā)出很多用于提效研發(fā)編程的技術(shù)插件,例如一些監(jiān)控、腳手架、接口API以及調(diào)試、流程化低代碼編排等等,所以這部分內(nèi)容的價(jià)值還是蠻大的。