IDEA插件开发流程(基于IDEA2023版本)
前言
最近想接触idea插件开发相关的内容,但发现网上很多文章都比较过时了,并不适用于高版本的idea和jdk,踩了一些坑后,写一篇文章总结一下高版本idea开发插件的步骤吧。
开发环境介绍
- 软件版本:JetBrain IDEA 2023.01
- JDK版本:JDK17
需要注意的是,从IDEA2022.2开始,就要求用户必须要有Java17及以上的版本才可以进行插件的开发。如果你不清楚自己的idea做插件开发所要求的最低jdk版本,可以参考官网文档的介绍:IDEA版本和JDK版本的对应关系,需要注意的是,如果只是做普通开发的话,那么并没有对idea的版本要求,按实际项目来就行。
(一)创建一个IDEA插件项目
插件开发的方式有两种,一种是直接通过idea自带的插件项目模板来构建我们的插件项目,另外一种是自己搭建一个gradle
项目,自己配置相关的插件项目构建脚本。我们这里就选择用IDEA自带的模板即可。
步骤一:新建一个插件项目
根据File->New->New Project
菜单路径,打开新建项目的窗口,根据下图配置好项目的存放路径以及对应的jdk,这里我们选择用jdk17
步骤二:打开我们的插件项目
我们可以看到,项目刚创建出来的时候,并没有我们熟悉的pom.xml
文件,这是因为idea已经默认采用gradle
来作为项目构建工具了,如果想要切换成maven来构建项目的话,按官网的说法也是可以的,但这里暂且不说。笔者大概看了一下,如果不涉及比较复杂的开发的话,项目中自带的构建脚本还是可以看得懂的。
plugin.xml
文件介绍
这个文件可以理解为我们插件的元数据文件,用于定义我们的插件名、开发人员、插件依赖以及插件包含的内容等信息,具体可以看下面的介绍
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- 插件id,不可重复,必须唯一。插件的升级后续也是依赖插件id来进行识别的 -->
<id>com.qiqv.demo</id>
<!-- 插件名称 -->
<name>Demo</name>
<!-- 插件开发人员,这里写一下开发者的个人信息. -->
<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插件构建时依赖的环境,以及最终支持在哪些环境下面运行插件。这个文件是相当重要的,一般来说我们这里会根据实际情况来对这个文件进行修改,不会直接用默认的配置。
// 项目依赖的插件,默认会依赖kotlin,但我们这里是直接用java来开发插件的,所以这里依赖我们可以去掉
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官网下载或者是用其他镜像
repositories {
mavenCentral()
}
// 这里是很重要的配置,定义了gradle构建时依赖的idea版本,我们进行插件调试的时候,会使用这里定义的idea版本来进行测试的。
intellij {
version.set("2022.2.5")
type.set("IC") // Target IDE Platform
plugins.set(listOf(/* Plugin Dependencies */))
}
// 定义构建的任务,主要是改一下编译的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在构建项目的时候会根据我们定义的idea版本去下载对应的idea安装包,有一说一,安装包比较大,大概有600多M,而且下载速度相对比较慢,最好做一下心理准备。如果想要换新的IDEA版本调试的话,那么也需要重新下载新的安装包。
(2)在比较高的版本中,idea默认会使用kotlin
语法来解析build.gradle.kts
和settings.gradle.kts
这两个文件。不过笔者对kotlin
不熟悉,所以我们会把配置切换为gradle
语法,降低一下学习成本。详见步骤三
步骤三:调整部署文件
(1)去掉build.gradle.kts
的kts后缀,稍微改一下原有文件的内容。调整后的文件内容如下
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
文件的后缀
文件里面的内容不需要调整
(3)删除src目录下的kotlin
目录,新建java
目录
最终得到的项目结构如下:
步骤四:创建我们的插件
(1)了解IDEA支持的插件类型
简单了解的话,大概可以分成是开发语言类插件(用于支持自己开发的语言,大佬专用)、框架插件(比如挺多人在用的mybatis插件
)、第三方工具插件(比如翻译插件)、UI交互类插件以及UI插件(纯UI美化)。
我们可以通过访问idea官网地址来查看idea支持的插件类型:点此查看
(2)我们这里选择做一个简单的UI交互插件
想要实现的效果为,在Help栏
中新增一个名为showProjectName的按钮,点击后展示当前项目的项目名称。
新建一个插件Action类
根据实际情况填写一下action 的详细信息,这里的name是插件的名称,实际上我这里是填showProjectName
的,截图的时候忘改了。
一般来说,加完之后plugin.xml
上面也会同步生成action的信息。
写一下Action
的具体代码,代码很简单,只是做一个dialog的信息展示而已
至此,插件的开发代码就完成了。至于插件的测试、构建和使用可以看下面的章节。
(二)插件的测试
插件代码写完后,我们可以从两个地方进行插件的调试。
入口一:菜单栏build
工具栏
如果是debug模式启动,我们还可以正常使用我们的断点功能。
入口二:主窗口左/右侧的gradle菜单栏
选择task->intelliJ
目录,里面有很多可执行的命令,我们选择使用runidea来启动项目
首次启动项目,会根据我们之前在build.gradle
文件中配置的idea版本去网上下载对应的安装包,可能耗时会有点久。下载成功后,会打开一个新的idea,打开后我们随便选择某个项目或者新建一个项目就行。
我们可以在打开的项目中,点击Help
菜单,就可以看到我们自己定义的UI插件
了
点击后正常弹出了内容为项目名的弹框
(三)插件的构建
当自己的插件测试好了之后,希望打包出来,可以通过buildPlugin
来打包我们的插件
构建好后我们可以在build/lib
目录下面找到我们的jar包,拿到后后续可以直接在idea上面进行离线安装
(四)插件校验
因为IDEA版本众多,如果你的插件希望可以被多个idea版本兼容的话,那么在你发布到你的团队或者发布到idea插件市场上时,建议先
走一次校验流程。这个校验流程会把所有版本的idea自动走一次你的插件(这里应该不是走全流程,只是校验是否能否正常编译运行而已)。当然了,由于这个版本会校验idea版本的兼容性,所以这里的耗时相对来说会比较长,因为要下载各个版本的idea去测试。
(五)其他的小拓展
如果说已经熟悉kotlin的使用,我们的插件也可以用kotlin来开发,相关的代码可以在我的码云上面找到。具体地址见下面的小结,第二个版本为kotlin语法开发的项目。
小结
至此,IDEA插件的开发就到此结束了。入门的插件开发并不难,有兴趣的话可以从官网或者其他开源的IDEA插件中翻翻代码,会有更多的收获。
本篇文章的代码已经上传至码云:https://gitee.com/moutory/idea-plugin-demo
参考文章:
IDEA插件开发官网文档 https://plugins.jetbrains.com/docs/intellij
《IntelliJ IDEA 插件开发》第一节:两种方式创建插件工程 http://www.360doc.com/content/21/1213/11/78097014_1008492774.shtml
基于IDEA2023.1.2使用Java语言开发IDEA插件的操作步骤 https://zhuanlan.zhihu.com/p/634452318