本文使用的 idea 2023.3 版本进行插件入门开发,首先要说明的是 idea 2023 版本及以后的 idea,对插件开发进行了一定程度的变动:
1、创建项目时不再支持 maven 选项
2、必须是 jdk17 及以后版本(点击查看官网版本对应关系)
3、默认创建的项目是基于 kotlin 的
4、idea 默认没有安装 ”Plugin DevKit“ 插件,需要自己安装
基于以上相关内容,本文创建一个 HelloWorld 级别的 idea 插件。
下面是创建项目后 idea 默认生成的代码结构:
因为 idea 默认基于 gradle 构建项目,所有工程中不再有 pom.xml 文件。虽然 idea 默认使用 kotlin,但是我想目前阶段大部分开发者应该还是习惯 java 模式,所以需要做一些修改,去除 kotlin 的相关配置。
1、去除 build.gradle.kts
和 settings.gradle.kts
文件的 .kts
后缀,修改 src/main/kotlin
中的 kotlin
为 java
,修改后的截图如下所示。
2、build.gradle.kts 文件介绍和修改
这个文件定义了IDEA插件构建时依赖的环境,以及最终支持在哪些环境下面运行插件,因为我们不使用 kotlin,所以我需要进行一些修改。
修改前的内容如下:
// 项目依赖的插件,默认会依赖kotlin,我们使用java来开发插件所以这里依赖我们去掉它
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "1.9.20"
id("org.jetbrains.intellij") version "1.16.0"
}
// 插件的一些基本信息,按实际情况填写
group = "com.example"
version = "1.0-SNAPSHOT"
// 依赖的中央仓库配置,这里我们一般是会改为直接去idea官网下载或者使用你的私服等镜像地址
repositories {
mavenCentral()
}
// 这里是很重要的配置,定义了gradle构建时依赖的idea版本,我们进行插件调试的时候,会使用这里定义的idea版本来进行测试
intellij {
version.set("2023.1.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("231")
untilBuild.set("241.*")
}
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"))
}
}
修改后的内容如下:
plugins {
id("java")
id("org.jetbrains.intellij") version "1.16.0"
}
group = "com.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
intellij {
version = "2023.3"
type = "IC" // Target IDE Platform
plugins = [/* Plugin Dependencies */]
updateSinceUntilBuild = false
}
tasks.withType(JavaCompile.class).configureEach(task -> {
task.getOptions().setEncoding("UTF-8");
sourceCompatibility = "17";
targetCompatibility = "17";
});
tasks.patchPluginXml {
// 注意这个版本号不能高于上面intellij的version,否则runIde会报错
sinceBuild.set("231")
untilBuild.set("241.*")
}
tasks.signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
tasks.publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN"))
}
修改完成后,点击 Gradle 小图标,确保最终控制台输出 BUILD SUCCESSFUL,通过构建后,右侧的 Gradle 面板就会出现各项 Task 内容,如下图所示:
3、配置 IntelliJ Platform Plugin SDK
IntelliJ Platform Plugin SDK 就是开发 IntelliJ 平台插件的 SDK,是基于 JDK 之上运行的,类似于开发 Android 应用需要 Android SDK。
导航到 File | Project Structure,选择对话框左侧栏 Platform Settings 下的 SDKs 进行添加操作,如下图所示:
4、配置关联源代码(可选,为了方便查看代码)
注意:关联源代码后,idea 下面会有扫描索引的操作,可能会导致你 idea 很卡,这里需要等一会。
现在创建一个点击可以弹出 HelloWorld 提示框的一个Action(动作)
点击 OK 按钮创建 Action 后,idea 为我们自动创建一个该 Action 动作的 Java 类 和 该插件对应配置,如下图所示:
接下来我们在 actionPerformed 方法中编写我们这个动作的代码,这里写一段代码使之弹出一个对话框,如下:
public class ShowHelloAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
String message = "你好,秀一下";
Messages.showInfoMessage(e.getProject(), message, "标题");
}
}
编写好代码后,我们在右侧 Gracle 中运行或者 Debug运行,稍等一会后就会打开一个新的 idea(这个运行的 idea 对应的版本就是 build.gradle
配置文件中配置的 version
所对应的版本) ,然后我们在这个新打开的 idea 中操作我们刚刚创建的 Action 即可验证效果。
如下图所示:
插件需要传播和发布,都需要打包,打包后会获得一个 zip 包,你可以分享给其他人安装,或者到 idea 插件市场里上传发布。
执行 buildPlugin
进行打包,观察控制台输出打包成功后,文件会生成到工程的 build/distributions
目录中,如下图所示:
因为IDEA版本很多,如果你的插件希望可以被多个 idea 版本兼容的话,那么在你分享给朋友或者发布到 idea 插件市场之前,建议先走一次校验流程。这个校验流程会把所有版本的 idea 自动走一次你的插件(只是校验是否能否正常在各个版本中安装运行)。由于这个版本会校验 idea 版本的兼容性,所以这里的耗时相对来说会比较长,因为它会自动下载各个版本的 idea 去挨个测试,每个版本的 idea 都要大几百上 G 的大小,这里你需要特别注意你的磁盘空间。
执行 Gradle 的 verifyPlugin
任务后慢慢等待直到完全结束。
至此,IDEA插件的第一个 Demo 到此结束。入门的插件开发并不难,有兴趣的话可以从官网或者其他开源的IDEA插件中翻翻代码学习,深入插件开发所需要学习的内容还是非常多的。