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

前言

最近想接觸idea插件開發(fā)相關的內(nèi)容,但發(fā)現(xiàn)網(wǎng)上很多文章都比較過時了,并不適用于高版本的idea和jdk,踩了一些坑后,寫一篇文章總結(jié)一下高版本idea開發(fā)插件的步驟吧。

開發(fā)環(huán)境介紹

  • 軟件版本:JetBrain IDEA 2023.01
  • JDK版本:JDK17
    需要注意的是,從IDEA2022.2開始,就要求用戶必須要有Java17及以上的版本才可以進行插件的開發(fā)。如果你不清楚自己的idea做插件開發(fā)所要求的最低jdk版本,可以參考官網(wǎng)文檔的介紹:IDEA版本和JDK版本的對應關系,需要注意的是,如果只是做普通開發(fā)的話,那么并沒有對idea的版本要求,按實際項目來就行。

(一)創(chuàng)建一個IDEA插件項目

插件開發(fā)的方式有兩種,一種是直接通過idea自帶的插件項目模板來構(gòu)建我們的插件項目,另外一種是自己搭建一個gradle項目,自己配置相關的插件項目構(gòu)建腳本。我們這里就選擇用IDEA自帶的模板即可。

步驟一:新建一個插件項目

根據(jù)File->New->New Project菜單路徑,打開新建項目的窗口,根據(jù)下圖配置好項目的存放路徑以及對應的jdk,這里我們選擇用jdk17

新建插件項目圖

步驟二:打開我們的插件項目

我們可以看到,項目剛創(chuàng)建出來的時候,并沒有我們熟悉的pom.xml文件,這是因為idea已經(jīng)默認采用gradle來作為項目構(gòu)建工具了,如果想要切換成maven來構(gòu)建項目的話,按官網(wǎng)的說法也是可以的,但這里暫且不說。筆者大概看了一下,如果不涉及比較復雜的開發(fā)的話,項目中自帶的構(gòu)建腳本還是可以看得懂的。

image.png

plugin.xml文件介紹

這個文件可以理解為我們插件的元數(shù)據(jù)文件,用于定義我們的插件名、開發(fā)人員、插件依賴以及插件包含的內(nèi)容等信息,具體可以看下面的介紹

<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
    <!-- 插件id,不可重復,必須唯一。插件的升級后續(xù)也是依賴插件id來進行識別的 -->
    <id>com.qiqv.demo</id>

    <!--  插件名稱 -->
    <name>Demo</name>

    <!-- 插件開發(fā)人員,這里寫一下開發(fā)者的個人信息. -->
    <vendor email="support@yourcompany.com" url="https://www.yourcompany.com">YourCompany</vendor>

    <!--  插件描述,這里一般是寫插件的功能介紹啥的 -->
    <description><![CDATA[
    Enter short description for your plugin here.<br>
    <em>most HTML tags may be used</em>
  ]]></description>

    <!--  插件依賴,這里我們默認引用idea自帶的依賴即可  -->
    <depends>com.intellij.modules.platform</depends>

    <!-- 定義拓展點,比較少用到,一般是用于你去拓展其他人插件功能拓展點,或者是你的插件擴展了 IntelliJ 平臺核心功能才會配置到這里 -->
    <extensions defaultExtensionNs="com.intellij">
    </extensions>
</idea-plugin>
build.gradle.kts文件介紹

這個文件定義了IDEA插件構(gòu)建時依賴的環(huán)境,以及最終支持在哪些環(huán)境下面運行插件。這個文件是相當重要的,一般來說我們這里會根據(jù)實際情況來對這個文件進行修改,不會直接用默認的配置。

// 項目依賴的插件,默認會依賴kotlin,但我們這里是直接用java來開發(fā)插件的,所以這里依賴我們可以去掉
plugins {
    id("java")
    id("org.jetbrains.kotlin.jvm") version "1.8.21"
    id("org.jetbrains.intellij") version "1.13.3"
}

// 插件的一些基本信息,按實際情況填就行,不是很重要
group = "com.qiqv"
version = "1.0-SNAPSHOT"

// 插件等依賴的下載地址,默認會去中央倉庫下載,這里我們一般是會改為直接去idea官網(wǎng)下載或者是用其他鏡像
repositories {
    mavenCentral()
}

// 這里是很重要的配置,定義了gradle構(gòu)建時依賴的idea版本,我們進行插件調(diào)試的時候,會使用這里定義的idea版本來進行測試的。
intellij {
    version.set("2022.2.5")
    type.set("IC") // Target IDE Platform

    plugins.set(listOf(/* Plugin Dependencies */))
}

// 定義構(gòu)建的任務,主要是改一下編譯的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個地方需要額外注意一下:
(1)gradle在構(gòu)建項目的時候會根據(jù)我們定義的idea版本去下載對應的idea安裝包,有一說一,安裝包比較大,大概有600多M,而且下載速度相對比較慢,最好做一下心理準備。如果想要換新的IDEA版本調(diào)試的話,那么也需要重新下載新的安裝包。
(2)在比較高的版本中,idea默認會使用kotlin語法來解析build.gradle.ktssettings.gradle.kts這兩個文件。不過筆者對kotlin不熟悉,所以我們會把配置切換為gradle語法,降低一下學習成本。詳見步驟三

步驟三:調(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 {
    //注意這個版本號不能高于上面intellij的version,否則runIde會報錯
    sinceBuild = '222'
    untilBuild = '232.*'
}

(2)去掉settings.gradle.kts文件的后綴

文件里面的內(nèi)容不需要調(diào)整

(3)刪除src目錄下的kotlin目錄,新建java目錄
image.png

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


最終的項目結(jié)構(gòu)圖
步驟四:創(chuàng)建我們的插件
(1)了解IDEA支持的插件類型

簡單了解的話,大概可以分成是開發(fā)語言類插件(用于支持自己開發(fā)的語言,大佬專用)、框架插件(比如挺多人在用的mybatis插件)、第三方工具插件(比如翻譯插件)、UI交互類插件以及UI插件(純UI美化)。
我們可以通過訪問idea官網(wǎng)地址來查看idea支持的插件類型:點此查看

image.png

(2)我們這里選擇做一個簡單的UI交互插件

想要實現(xiàn)的效果為,在Help欄中新增一個名為showProjectName的按鈕,點擊后展示當前項目的項目名稱。

新建一個插件Action類
新建插件Action

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

填寫action的詳細信息

一般來說,加完之后plugin.xml上面也會同步生成action的信息。

image.png

寫一下Action的具體代碼,代碼很簡單,只是做一個dialog的信息展示而已

代碼...

至此,插件的開發(fā)代碼就完成了。至于插件的測試、構(gòu)建和使用可以看下面的章節(jié)。

(二)插件的測試

插件代碼寫完后,我們可以從兩個地方進行插件的調(diào)試。
入口一:菜單欄build工具欄
如果是debug模式啟動,我們還可以正常使用我們的斷點功能。

從菜單欄上面的構(gòu)建按鈕運行項目

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

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

首次啟動項目,會根據(jù)我們之前在build.gradle文件中配置的idea版本去網(wǎng)上下載對應的安裝包,可能耗時會有點久。下載成功后,會打開一個新的idea,打開后我們隨便選擇某個項目或者新建一個項目就行。

啟動完成后會新打開一個idea

我們可以在打開的項目中,點擊Help菜單,就可以看到我們自己定義的UI插件

image.png

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


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

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

當自己的插件測試好了之后,希望打包出來,可以通過buildPlugin來打包我們的插件

插件構(gòu)建

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

插件jar包位置

(四)插件校驗

因為IDEA版本眾多,如果你的插件希望可以被多個idea版本兼容的話,那么在你發(fā)布到你的團隊或者發(fā)布到idea插件市場上時,建議先
走一次校驗流程。這個校驗流程會把所有版本的idea自動走一次你的插件(這里應該不是走全流程,只是校驗是否能否正常編譯運行而已)。當然了,由于這個版本會校驗idea版本的兼容性,所以這里的耗時相對來說會比較長,因為要下載各個版本的idea去測試。


插件校驗

(五)其他的小拓展

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


image.png

小結(jié)

至此,IDEA插件的開發(fā)就到此結(jié)束了。入門的插件開發(fā)并不難,有興趣的話可以從官網(wǎng)或者其他開源的IDEA插件中翻翻代碼,會有更多的收獲。
本篇文章的代碼已經(jīng)上傳至碼云:https://gitee.com/moutory/idea-plugin-demo

參考文章:

IDEA插件開發(fā)官網(wǎng)文檔 https://plugins.jetbrains.com/docs/intellij
《IntelliJ IDEA 插件開發(fā)》第一節(jié):兩種方式創(chuàng)建插件工程 http://www.360doc.com/content/21/1213/11/78097014_1008492774.shtml
基于IDEA2023.1.2使用Java語言開發(fā)IDEA插件的操作步驟 https://zhuanlan.zhihu.com/p/634452318

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

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

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