Smart Input Source插件推荐给大家使用,它可以实现根据输入处上下文自动切换到对应的输入法,将开发者从杂乱繁琐的输入法切换中解救出来。具体效果请查看《IntelliJ IDEA插件实现自动切换输入法》,欢迎到插件市场下载安装。
-
IntelliJ IDEA插件开发系列教程综述
-
IntelliJ IDEA插件开发系列教程之开发思路
-
IntelliJ IDEA插件开发系列教程之新建项目
进行代码演示的项目可以从Github获取idea-plugin-demo
新建项目
新建项目比较简单,操作路径File->New->Project->IDE Plugin,开发插件可以使用Java和Kotlin两种语言,Kotlin我也不会,但是IntelliJ Platform很多代码是用Kotlin写的,不过没有关系,大概能看懂个意思会使用其API就行。JDK最好选择17及以上,因为2022版本IDEA已经是基于JDK17开发的。
项目构建
项目创建完成之后就开始自动构建,最耗时的步骤在于下载用于调试的idea完整版,因此有600多兆,只有耐心的等待下载完成,如果期间失败了,点击左上角圆圈刷新后继续。
依赖下载完成之后可以打开Gradle的ToolWindow,点击buildPlugin就可以开始编译整个项目,并在项目根目录下面生成build文件夹。
项目结构
新建项目编译完后结构如下所示,gradle、build.gradel.kts、settings.gradel.kts、gradlew、gradlew.bat都是与Gradle相关的文件,其中gradle文件夹包含了完整的gradle运行环境,是为了解决版本迭代对项目的影响,一般不要动,build.gradel.kts类似Maven的Pom文件,配置了项目相关的依赖和插件等。gradlew、gradlew.bat分别是Linux系统和windows系统的命令工具,一般不要动。
build是编译输出的产物,其中distributions就是最终生成的插件,可以传播并从disk进行安装,idea-sandbox是调试idea的沙箱环境,其中idea-sandbox/system/log/idea.log是调试时idea打的日志。
plugin.xml文件是插件非常重要的配置文件,IntelliJ Platform加载插件的时候会首先读取插件的这个文件进行加载。
pluginIcon.svg是插件的ICON文件,不过需要SVG格式的图片,后面会讲解去哪里可以找到合适的ICON资源。
Gradle管理
最新版的IDEA插件项目已经是采用Kotlin版Gradle进行依赖管理,如果你看一些比较老的插件代码,它们可能采用Maven或者Groovy版Gradle进行依赖管理,Maven版本的应该是很难见到了,但是Groovy版Gradle管理依赖的插件很是有很多,Groovy版Gradle的配置配置文件名为build.gradle,两个版本的配置文件的语法是非常不同的,所以不要搞错了。
plugins是指Gradle的插件,我们整个项目的语言环境是Java,所以我们需要使用Java的插件,另外intellij也提供了Gradel插件方便我们编译调试等。group和version类似Maven,repositories中指定使用maven的中央仓库,dependencies管理项目的依赖,implementation指定依赖的使用范围实在编译期和运行期,依赖定位跟maven一样使用groupId、artificId、version。
intellij里面配置插件调试的运行环境,version执行IDEA的版本,type指定IDEA的类型,IC表示community版本,IU表示ultimate版本,一般使用community版进行调试就好了,ultimate版本调试依然需要输入License。
targetCompatibility表示依赖的Jdk版本,如果你是windows系统可能出现使用错误的编码导致编译失败,所以可以在这里指定编码options.encoding = "UTF-8"。sinceBuild表示插件支持的IDEA起始版本,untilBuild表示插件支持的IDEA最大版本,只有在支持范围之内的IDEA版本才能使用该插件,这里的IDEA版本看着有点奇怪,它其实是IDEA的编译版本,区别于IDEA的发行版本“2022.1.4”,不过他们之间也有一定的规则,比如发行版本“2022.1.4”对应的编译版本号前缀应该是“221.”,年份后两位22加中间的1。
plugins {
id("java")
id("org.jetbrains.intellij") version "1.9.0"
}
group = "com.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework:spring-web:5.3.23")
implementation("com.squareup.okhttp3:okhttp:4.7.2")
implementation("com.alibaba:fastjson:1.2.54.sec06")
}
// Configure Gradle IntelliJ Plugin
// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html
intellij {
version.set("2022.1.4")
type.set("IC") // Target IDE Platform
}
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "11"
targetCompatibility = "11"
options.encoding = "UTF-8"
}
patchPluginXml {
sinceBuild.set("221")
untilBuild.set("231.*")
}
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"))
}
}
plugin.xml
plugin.xml的使用会贯穿整个教程,所以这里只是简单讲解一下,后面遇到具体的功能实现再具体讲解。require-restart可以配置安装或更新插件时是否需要重启Idea。id表示该插件的id,需要唯一。name表示该插件的名称,需要使用英文,单词首字符大写,单词之间空格隔开。vender表示开发者信息。description表示插件的描述信息,支持简单html标签,会展示在插件的介绍页面,其中一定要包含英文介绍,否则无法在插件市场上架。depends表示插件的依赖,必须依赖的是platform代码。extensions表示平台的拓展点实现,IntelliJ Platform采用拓展与被拓展架构,Platform里面预先开发好了很多可以拓展的点,插件只需要实现对应的拓展,并在这里注册。具体在后面再讲吧。
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin require-restart="true">
<!-- Unique identifier of the plugin. It should be FQN. It cannot be changed between the plugin versions. -->
<id>com.example.plugin-demo</id>
<!-- Public plugin name should be written in Title Case.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-name -->
<name>Plugin demo</name>
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="support@yourcompany.com" url="https://www.yourcompany.com">YourCompany</vendor>
<!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
Simple HTML elements (text formatting, paragraphs, and lists) can be added inside of <![CDATA[ ]]> tag.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-description -->
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<extensions defaultExtensionNs="com.intellij">
</extensions>
</idea-plugin>