IDEA插件開(kāi)發(fā)流程(基于IDEA2023版本)

前言

最近想接觸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

新建插件項(xiàng)目圖

步驟二:打開(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)建腳本還是可以看得懂的。

image.png

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.ktssettings.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目錄
image.png

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


最終的項(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)此查看

image.png

(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)
新建插件Action

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

填寫(xiě)action的詳細(xì)信息

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

image.png

寫(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)功能。

從菜單欄上面的構(gòu)建按鈕運(yùn)行項(xiàng)目

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

從左/右側(cè)的gradle菜單欄中選擇task執(zhí)行

首次啟動(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)目就行。

啟動(dòng)完成后會(huì)新打開(kāi)一個(gè)idea

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

image.png

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


點(diǎn)擊按鈕后出現(xiàn)彈框提示

(三)插件的構(gòu)建

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

插件構(gòu)建

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

插件jar包位置

(四)插件校驗(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è)試。


插件校驗(yàn)

(五)其他的小拓展

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


image.png

小結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容