前言
最近想接觸idea插件開(kāi)發(fā)相關(guān)的內(nèi)容,但發(fā)現(xiàn)網(wǎng)上很多文章都比較過(guò)時(shí)了,并不適用于高版本的idea和jdk,踩了一些坑后,寫(xiě)一篇文章總結(jié)一下高版本idea開(kāi)發(fā)插件的步驟吧。
開(kāi)發(fā)環(huán)境介紹
- 軟件版本:JetBrain IDEA 2023.01
- JDK版本:JDK17
需要注意的是,從IDEA2022.2開(kāi)始,就要求用戶必須要有Java17及以上的版本才可以進(jìn)行插件的開(kāi)發(fā)。如果你不清楚自己的idea做插件開(kāi)發(fā)所要求的最低jdk版本,可以參考官網(wǎng)文檔的介紹:IDEA版本和JDK版本的對(duì)應(yīng)關(guān)系,需要注意的是,如果只是做普通開(kāi)發(fā)的話,那么并沒(méi)有對(duì)idea的版本要求,按實(shí)際項(xiàng)目來(lái)就行。
(一)創(chuàng)建一個(gè)IDEA插件項(xiàng)目
插件開(kāi)發(fā)的方式有兩種,一種是直接通過(guò)idea自帶的插件項(xiàng)目模板來(lái)構(gòu)建我們的插件項(xiàng)目,另外一種是自己搭建一個(gè)gradle項(xiàng)目,自己配置相關(guān)的插件項(xiàng)目構(gòu)建腳本。我們這里就選擇用IDEA自帶的模板即可。
步驟一:新建一個(gè)插件項(xiàng)目
根據(jù)File->New->New Project菜單路徑,打開(kāi)新建項(xiàng)目的窗口,根據(jù)下圖配置好項(xiàng)目的存放路徑以及對(duì)應(yīng)的jdk,這里我們選擇用jdk17

步驟二:打開(kāi)我們的插件項(xiàng)目
我們可以看到,項(xiàng)目剛創(chuàng)建出來(lái)的時(shí)候,并沒(méi)有我們熟悉的pom.xml文件,這是因?yàn)閕dea已經(jīng)默認(rèn)采用gradle來(lái)作為項(xiàng)目構(gòu)建工具了,如果想要切換成maven來(lái)構(gòu)建項(xiàng)目的話,按官網(wǎng)的說(shuō)法也是可以的,但這里暫且不說(shuō)。筆者大概看了一下,如果不涉及比較復(fù)雜的開(kāi)發(fā)的話,項(xiàng)目中自帶的構(gòu)建腳本還是可以看得懂的。

plugin.xml文件介紹
這個(gè)文件可以理解為我們插件的元數(shù)據(jù)文件,用于定義我們的插件名、開(kāi)發(fā)人員、插件依賴以及插件包含的內(nèi)容等信息,具體可以看下面的介紹
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- 插件id,不可重復(fù),必須唯一。插件的升級(jí)后續(xù)也是依賴插件id來(lái)進(jìn)行識(shí)別的 -->
<id>com.qiqv.demo</id>
<!-- 插件名稱(chēng) -->
<name>Demo</name>
<!-- 插件開(kāi)發(fā)人員,這里寫(xiě)一下開(kāi)發(fā)者的個(gè)人信息. -->
<vendor email="support@yourcompany.com" url="https://www.yourcompany.com">YourCompany</vendor>
<!-- 插件描述,這里一般是寫(xiě)插件的功能介紹啥的 -->
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
<!-- 插件依賴,這里我們默認(rèn)引用idea自帶的依賴即可 -->
<depends>com.intellij.modules.platform</depends>
<!-- 定義拓展點(diǎn),比較少用到,一般是用于你去拓展其他人插件功能拓展點(diǎn),或者是你的插件擴(kuò)展了 IntelliJ 平臺(tái)核心功能才會(huì)配置到這里 -->
<extensions defaultExtensionNs="com.intellij">
</extensions>
</idea-plugin>
build.gradle.kts文件介紹
這個(gè)文件定義了IDEA插件構(gòu)建時(shí)依賴的環(huán)境,以及最終支持在哪些環(huán)境下面運(yùn)行插件。這個(gè)文件是相當(dāng)重要的,一般來(lái)說(shuō)我們這里會(huì)根據(jù)實(shí)際情況來(lái)對(duì)這個(gè)文件進(jìn)行修改,不會(huì)直接用默認(rèn)的配置。
// 項(xiàng)目依賴的插件,默認(rèn)會(huì)依賴kotlin,但我們這里是直接用java來(lái)開(kāi)發(fā)插件的,所以這里依賴我們可以去掉
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "1.8.21"
id("org.jetbrains.intellij") version "1.13.3"
}
// 插件的一些基本信息,按實(shí)際情況填就行,不是很重要
group = "com.qiqv"
version = "1.0-SNAPSHOT"
// 插件等依賴的下載地址,默認(rèn)會(huì)去中央倉(cāng)庫(kù)下載,這里我們一般是會(huì)改為直接去idea官網(wǎng)下載或者是用其他鏡像
repositories {
mavenCentral()
}
// 這里是很重要的配置,定義了gradle構(gòu)建時(shí)依賴的idea版本,我們進(jìn)行插件調(diào)試的時(shí)候,會(huì)使用這里定義的idea版本來(lái)進(jìn)行測(cè)試的。
intellij {
version.set("2022.2.5")
type.set("IC") // Target IDE Platform
plugins.set(listOf(/* Plugin Dependencies */))
}
// 定義構(gòu)建的任務(wù),主要是改一下編譯的jdk版本,插件適用的idea版本等信息
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "17"
targetCompatibility = "17"
}
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "17"
}
patchPluginXml {
sinceBuild.set("222")
untilBuild.set("232.*")
}
signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN"))
}
}
這里有2個(gè)地方需要額外注意一下:
(1)gradle在構(gòu)建項(xiàng)目的時(shí)候會(huì)根據(jù)我們定義的idea版本去下載對(duì)應(yīng)的idea安裝包,有一說(shuō)一,安裝包比較大,大概有600多M,而且下載速度相對(duì)比較慢,最好做一下心理準(zhǔn)備。如果想要換新的IDEA版本調(diào)試的話,那么也需要重新下載新的安裝包。
(2)在比較高的版本中,idea默認(rèn)會(huì)使用kotlin語(yǔ)法來(lái)解析build.gradle.kts和settings.gradle.kts這兩個(gè)文件。不過(guò)筆者對(duì)kotlin不熟悉,所以我們會(huì)把配置切換為gradle語(yǔ)法,降低一下學(xué)習(xí)成本。詳見(jiàn)步驟三
步驟三:調(diào)整部署文件
(1)去掉build.gradle.kts的kts后綴,稍微改一下原有文件的內(nèi)容。調(diào)整后的文件內(nèi)容如下
plugins {
id("java")
id("org.jetbrains.intellij") version "1.13.3"
}
group = "com.qiqv"
version = "1.0-SNAPSHOT"
repositories {
maven { url 'https://maven.aliyun.com/repository/central/'}
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
// mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.9.3'
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.9.3'
}
intellij {
version = '2022.2'
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
options.compilerArgs += ['-Xlint:unchecked', '-Xlint:deprecation', '-parameters']
}
patchPluginXml {
//注意這個(gè)版本號(hào)不能高于上面intellij的version,否則runIde會(huì)報(bào)錯(cuò)
sinceBuild = '222'
untilBuild = '232.*'
}
(2)去掉settings.gradle.kts文件的后綴
文件里面的內(nèi)容不需要調(diào)整
(3)刪除src目錄下的kotlin目錄,新建java目錄

最終得到的項(xiàng)目結(jié)構(gòu)如下:

步驟四:創(chuàng)建我們的插件
(1)了解IDEA支持的插件類(lèi)型
簡(jiǎn)單了解的話,大概可以分成是開(kāi)發(fā)語(yǔ)言類(lèi)插件(用于支持自己開(kāi)發(fā)的語(yǔ)言,大佬專(zhuān)用)、框架插件(比如挺多人在用的mybatis插件)、第三方工具插件(比如翻譯插件)、UI交互類(lèi)插件以及UI插件(純UI美化)。
我們可以通過(guò)訪問(wèn)idea官網(wǎng)地址來(lái)查看idea支持的插件類(lèi)型:點(diǎn)此查看

(2)我們這里選擇做一個(gè)簡(jiǎn)單的UI交互插件
想要實(shí)現(xiàn)的效果為,在Help欄中新增一個(gè)名為showProjectName的按鈕,點(diǎn)擊后展示當(dāng)前項(xiàng)目的項(xiàng)目名稱(chēng)。
新建一個(gè)插件Action類(lèi)

根據(jù)實(shí)際情況填寫(xiě)一下action 的詳細(xì)信息,這里的name是插件的名稱(chēng),實(shí)際上我這里是填showProjectName的,截圖的時(shí)候忘改了。

一般來(lái)說(shuō),加完之后plugin.xml上面也會(huì)同步生成action的信息。

寫(xiě)一下Action的具體代碼,代碼很簡(jiǎn)單,只是做一個(gè)dialog的信息展示而已

至此,插件的開(kāi)發(fā)代碼就完成了。至于插件的測(cè)試、構(gòu)建和使用可以看下面的章節(jié)。
(二)插件的測(cè)試
插件代碼寫(xiě)完后,我們可以從兩個(gè)地方進(jìn)行插件的調(diào)試。
入口一:菜單欄build工具欄
如果是debug模式啟動(dòng),我們還可以正常使用我們的斷點(diǎn)功能。

入口二:主窗口左/右側(cè)的gradle菜單欄
選擇task->intelliJ目錄,里面有很多可執(zhí)行的命令,我們選擇使用runidea來(lái)啟動(dòng)項(xiàng)目

首次啟動(dòng)項(xiàng)目,會(huì)根據(jù)我們之前在build.gradle文件中配置的idea版本去網(wǎng)上下載對(duì)應(yīng)的安裝包,可能耗時(shí)會(huì)有點(diǎn)久。下載成功后,會(huì)打開(kāi)一個(gè)新的idea,打開(kāi)后我們隨便選擇某個(gè)項(xiàng)目或者新建一個(gè)項(xiàng)目就行。

我們可以在打開(kāi)的項(xiàng)目中,點(diǎn)擊Help菜單,就可以看到我們自己定義的UI插件了

點(diǎn)擊后正常彈出了內(nèi)容為項(xiàng)目名的彈框

(三)插件的構(gòu)建
當(dāng)自己的插件測(cè)試好了之后,希望打包出來(lái),可以通過(guò)buildPlugin來(lái)打包我們的插件

構(gòu)建好后我們可以在build/lib目錄下面找到我們的jar包,拿到后后續(xù)可以直接在idea上面進(jìn)行離線安裝

(四)插件校驗(yàn)
因?yàn)镮DEA版本眾多,如果你的插件希望可以被多個(gè)idea版本兼容的話,那么在你發(fā)布到你的團(tuán)隊(duì)或者發(fā)布到idea插件市場(chǎng)上時(shí),建議先
走一次校驗(yàn)流程。這個(gè)校驗(yàn)流程會(huì)把所有版本的idea自動(dòng)走一次你的插件(這里應(yīng)該不是走全流程,只是校驗(yàn)是否能否正常編譯運(yùn)行而已)。當(dāng)然了,由于這個(gè)版本會(huì)校驗(yàn)idea版本的兼容性,所以這里的耗時(shí)相對(duì)來(lái)說(shuō)會(huì)比較長(zhǎng),因?yàn)橐螺d各個(gè)版本的idea去測(cè)試。

(五)其他的小拓展
如果說(shuō)已經(jīng)熟悉kotlin的使用,我們的插件也可以用kotlin來(lái)開(kāi)發(fā),相關(guān)的代碼可以在我的碼云上面找到。具體地址見(jiàn)下面的小結(jié),第二個(gè)版本為kotlin語(yǔ)法開(kāi)發(fā)的項(xiàng)目。

小結(jié)
至此,IDEA插件的開(kāi)發(fā)就到此結(jié)束了。入門(mén)的插件開(kāi)發(fā)并不難,有興趣的話可以從官網(wǎng)或者其他開(kāi)源的IDEA插件中翻翻代碼,會(huì)有更多的收獲。
本篇文章的代碼已經(jīng)上傳至碼云:https://gitee.com/moutory/idea-plugin-demo
參考文章:
IDEA插件開(kāi)發(fā)官網(wǎng)文檔 https://plugins.jetbrains.com/docs/intellij
《IntelliJ IDEA 插件開(kāi)發(fā)》第一節(jié):兩種方式創(chuàng)建插件工程 http://www.360doc.com/content/21/1213/11/78097014_1008492774.shtml
基于IDEA2023.1.2使用Java語(yǔ)言開(kāi)發(fā)IDEA插件的操作步驟 https://zhuanlan.zhihu.com/p/634452318