作者:小傅哥
博客:https://bugstack.cn
?沉淀、分享、成長,讓自己和他人都能有所收獲!??
?
一、前言
二、需求目的
三、環(huán)境說明
四、模板方式創(chuàng)建
1. 創(chuàng)建引導(dǎo)
2. 工程結(jié)構(gòu)
3. plugin.xml 配置
4. MyAction 事件入口
5. 運(yùn)行測(cè)試
五、Gradle 方式創(chuàng)建
1. 創(chuàng)建引導(dǎo)
2. 工程結(jié)構(gòu)
3. build.gradle 配置
4. MyAction 事件入口
5. 運(yùn)行測(cè)試
六、總結(jié)
七、系列推薦
并不是所有的不會(huì),都是真不會(huì)!
對(duì)于碼農(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)手冊(cè),所以就遇到了很多不知道就不會(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ì)想什么場(chǎng)景會(huì)需要用到插件開發(fā),其實(shí)插件開發(fā)算是一種通用的解決方案,由服務(wù)平臺(tái)定義標(biāo)準(zhǔn)讓各自使用方進(jìn)行自需的擴(kuò)展。
這就像我們非常常用的 P3C 代碼檢查插件、代碼審計(jì)插件、腳手架工程創(chuàng)建插件、自動(dòng)化API提取插件、單元測(cè)試統(tǒng)計(jì)插件等等,這些都是在 IDEA 代碼開發(fā)平臺(tái)擴(kuò)展出來的各項(xiàng)功能插件。
插件也可以說是一種解決方案,其實(shí)與你在代碼編程時(shí)使用人家已經(jīng)定義好的標(biāo)準(zhǔn)結(jié)構(gòu)和功能下,擴(kuò)展出自己的功能時(shí)是一樣的。而這種方式也可以非常好的解決一些屬于代碼開發(fā)期間不易于放到代碼提測(cè)后問題場(chǎng)景,并能及時(shí)提醒研發(fā)人員作出響應(yīng)的修改處理。
在官方文檔 https://plugins.jetbrains.com/docs/intellij/disposers.html 介紹開發(fā) IDEA 插件的工程方式有兩種,分別是模板方式和 Gradle 工程方式。這里我們分別演示下不同方式下工程的創(chuàng)建和所涉及到知識(shí)點(diǎn)內(nèi)容的介紹,雖然兩種方式都能創(chuàng)建 IDEA 插件工程,但更推薦使用 Gradle 方式。
New -> Project -> IntelliJ Platform Plugin
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
<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[
插件開發(fā)學(xué)習(xí)功能點(diǎn)<br>
<em>1. 工程搭建</em>
<em>2. 菜單讀取</em>
<em>3. 獲取配置</em>
<em>4. 回顯頁面</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>
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());
}
}
運(yùn)行過程
運(yùn)行結(jié)果
New -> Project -> Gradle 選中 Java & IntelliJ Platform Plugin
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
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>
]]>"""
}
id 'org.jetbrains.intellij' version '0.6.3'
默認(rèn)創(chuàng)建工程的版本有點(diǎn)高,與 gradle 5.x 不匹配。不過你可以嘗試調(diào)試合適版本進(jìn)行使用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());
}
}
:runIde
,也是和普通的代碼調(diào)試一樣。運(yùn)行結(jié)果