IntelliJ IDE 插件开发 |(一)快速入门

news2024/11/25 14:57:15

前言

IntelliJ IDEA 作为 Java 开发的首选 IDE,其强大、方便之处不必多说。不过,由于个人或者团队的个性化需求,我们或多或少会想对其功能进行拓展,这时就需要开发插件(在 IntelliJ 平台下的所有 IDE 均可运行)才能满足。希望本系列文章能帮助你入门到开发一款属于自己的插件,作为本系列的第一篇文章,先说明一下软件环境:

工具版本
IDEA2023.2.5(New UI)
Java17
Kotlin1.9.0
Gradle8.2

后续开发将使用 Kotlin 作为首选语言,部分场景(例如 UI)设计还是用 Java 开发,因此需要确保 IDEA 已经安装 Kotlin 插件:

image-20231116144716178

之所以选择 Kotlin 开发插件,也是希望借此机会让自己持续学习,其实作为 Javaer,相信各位很快也可以上手的,这里推荐一下官方的快速入门文档。话不多说,IDEA,启动!

本文所用到的完整代码已上传到GitHub。

创建项目

这里选择的是通过 IDEA 自带的插件模板来创建项目,如下图所示:

image-20231116145607962

点击创建后需要稍等片刻,等待依赖下载完毕。随后可以看到以下的项目结构:

image-20231116150018400

这里只需要主要两个文件,一个是plugin.xml用于进行插件的各项配置,一个是build.gradle.kts用于项目的依赖、打包等管理,类似于maven中的pom.xml,在下一小结将介绍这两个文件中的配置项。

配置文件及说明

plugin.xml

<idea-plugin>
    <!-- 插件唯一标识符 -->
    <id>cn.butterfly.startup</id>

    <!-- 插件名称 -->
    <name>Startup</name>

    <!-- 作者信息 -->
    <vendor email="1945192314@qq.com" url="https://juejin.cn/user/3350967174567352">butterfly</vendor>

    <!-- 插件描述, 支持 HTML 标签, 内容使用 <![CDATA[]] 进行包裹 -->
    <description><![CDATA[
        <h1>IntelliJ IDE 插件开发入门</h1>
        <ul>
            <li>1. 开发</li>
            <li>2. 运行</li>
            <li>3. 安装</li>
        </ul>
    ]]>
    </description>

    <!-- 后续用到再介绍, 可以先忽略 -->
    <depends>com.intellij.modules.platform</depends>

    <!-- 后续用到再介绍, 可以先忽略 -->
    <extensions defaultExtensionNs="com.intellij">
    </extensions>
</idea-plugin>

build.gradle.kts

plugins {
    id("java")
    id("org.jetbrains.kotlin.jvm") version "1.9.0"
    id("org.jetbrains.intellij") version "1.15.0"
}

// 项目信息
group = "cn.butterfly"
version = "1.0.0"

repositories {
    mavenCentral()
}

// 配置开发过程中运行的 IDEA 沙盒信息
intellij {
    // IDEA 的版本
    version.set("2023.2.5")
    // 这里 IU 是指付费版, 也可以选择 IC 对应社区版
    type.set("IU")

    // 用到的插件
    plugins.set(listOf())
}

tasks {
    // 设置 Java 版本
    withType<JavaCompile> {
        sourceCompatibility = "17"
        targetCompatibility = "17"
    }
    withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions.jvmTarget = "17"
    }

    // 设置插件兼容的版本
    patchPluginXml {
        sinceBuild.set("222")
        untilBuild.set("232.*")
    }
}

Hello World

熟悉完配置文件后,我们来实现一个弹出 Hello World 提示的 Demo 吧!

在编码之前,需要先了解一个概念:Action,在 IDEA 中的各种操作,例如使用快捷键 CV 代码或者通过右键菜单选择CV 选项进行代码的 CV,都对应着相应的 Action。也就是说,我们想通过某个触发动作(使用快捷键或者菜单)来实现指定功能就需要定义对应的 Action。

那么如果创建一个 Action 呢?主要有两种方式:1. 手工创建, 2. 使用 IDEA 的模板(如下图所示)。由于 IDEA 模板创建的代码是基于 Java,这里就选择手工创建了。

image-20231116154928716

创建 HelloWorldAction 类

创建的 Action 类需要继承AnAction类,并重写actionPerformed来实现我们自定义的操作:

import com.intellij.notification.Notification
import com.intellij.notification.NotificationType
import com.intellij.notification.Notifications
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent

/**
 * HelloWorldAction
 *
 * @author butterfly
 * @date 2023-11-16
 */
class HelloWorldAction : AnAction() {
    
    override fun actionPerformed(e: AnActionEvent) {
        Notifications.Bus.notify(
            Notification("Print", "", "Hello, World!", NotificationType.INFORMATION),
            e.project
        )
    }

}

在 plugin.xml 中增加配置

<actions>
    <!-- 定义 id, 对应类和显示的文本 -->
    <action id="HelloWorldAction" class="cn.butterfly.startup.HelloWorldAction" text="HelloWorldAction">
        <!-- 添加到编辑器菜单的第一项 -->
        <add-to-group group-id="EditorPopupMenu" anchor="first"/>
        
        <!-- 可通过 ctrl + H 快捷键触发 -->
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl H"/>
    </action>
</actions>

运行

完成以上编码后运行,在启动的新 IDEA 中新建或者打开一个项目,选择呢一个文件后在编辑器里邮件,会发现第一项就是我们添加的 Action 了:

image-20231116161201332

点击该项,或者通过 Ctrl + H 快捷键均可以触发弹框:

image-20231116161252993

插件信息

在插件列表中可以发现我们的插件和配置的信息:

image-20231116161538342

这里的配置信息就是我们在plugin.xml中配置的内容,而这个图标则对应我们上文中未介绍的pluginIcon.svg文件(和plugin.xml同级)。

安装

需要注意的是以上插件运行安装均是在沙盒环境中,如果想在自己的 IDEA 中安装插件,则需要先进行打包:

image-20231116162127906

然后就可以在项目的 build 文件下发现打包后的插件:

image-20231116162206305

然后在安装时,从本地选择这个文件即可:

image-20231116162248375

总结

作为本系列的第一篇文章,本文只简单讲解了项目的搭建和运行方式,不过万事开头难,在搭建和首次运行的过程中,可能会遇到各种版本甚至网络的问题,也欢迎在评论区进行交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot配置数据库密码加密的方法

由于系统安全的考虑,配置文件中不能出现明文密码的问题,本文就给大家详细介绍下springboot配置数据库密码加密的方法,下面话不多说了,来一起看看详细的介绍吧,需要的朋友可以参考下 1.导入依赖 <!--数据库密码加密--> <dependency><groupId>com.github.uli…

Greek Alphabet Letters Symbols

Upper CaseLower CaseGreek Letter NameEnglish EquivalentSoundΑαAlphaa ΒβBetab ΓγGammag ΔδDeltad ΕεEpsilone ΖζZetaz ΗηEtah ΘθThetath ΙιIotai ΚκKappak ΛλLambdal ΜμMum ΝνNun ΞξXix ΟοOmicrono ΠπPip ΡρRhor Σσ,…

Apache SCXML2 RCE漏洞

文章目录 前言源码利用上传恶意xml文件构造payload搭建Apache服务器 远程RCE 前言 在做 [HDCTF 2023]BabyJxVx 遇到的知识点&#xff0c;但是没公网的服务器只能作罢&#xff0c;写下这篇文章记录 源码利用 public String Flag(RequestParam(required true) String filenam…

Leetcode刷题详解——扫雷游戏

1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xff1a; 让我们一起来玩扫雷游戏&#xff01; 给你一个大小为 m x n 二维字符矩阵 board &#xff0c;表示扫雷游戏的盘面&#xff0c;其中&#xff1a; M 代表一个 未挖出的 地雷&#xff0c;E 代表一个 未挖出的 空方…

基于django电影推荐系统

基于django电影推荐系统 摘要 该Django电影推荐系统是一个简单而基础的框架&#xff0c;旨在展示系统的基本组件。系统包括两个主要模型&#xff0c;即Movie和Rating&#xff0c;用于存储电影信息和用户评分。视图层包括展示电影列表和电影详情的功能&#xff0c;使用模板进行页…

linux高级篇基础理论二(详细文档、LAMP、SHELL、sed正则表达式)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

大数据架构Lambda-架构师(六十九)

随着信息时代技术的发展&#xff0c;数据量的快速增加逐渐飙升到了惊人的数量级别。并且数据的采集与处理技术还在更新加快。大数据中&#xff0c;结构化占比百分之15左右&#xff0c;其余百分之85都是非结构化数据&#xff0c;他们大量存在于社交网络、互联网和电子商务等领域…

深入理解锁

目录 常用锁策略 1.乐观锁 VS 悲观锁 2.轻量级锁 VS 重量级锁 3.自旋锁 VS 挂起等待锁 4.互斥锁 VS 读写锁 5.公平锁 VS 非公平锁 6.可重入锁 VS 可重入锁 CAS ABA问题 Synchronized原理 1. 锁升级/锁膨胀 2.锁消除 3.锁粗化 常用锁策略 1.乐观锁 VS 悲观锁 站在…

【Java实现图书管理系统】

图书管理系统 1. 设计背景2. 设计思路3. 模块展示代码演示3.1 Book类3.2 BookList类&#xff08;书架类&#xff09;3.4 用户类 - User类3.5 子类管理员类 -- AdminUser类3.6 子类普通用户类 -- NormalUser类3.7 操作接口3.8 操作类3.8.1 查找操作 -- FindOperation类3.8.2 增加…

PostgreSQL基于Citus实现的分布式集群

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

LCD1602指定位置显示字符串-详细版

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

Hive数据表操作--学习笔记

1&#xff0c;Hive数据表操作 1&#xff0c;建表语句和内外部表 ①创建内部表 create [external] table [if not exists] 表名( 字段名 字段类型 [comment 注释], 字段名 字段类型 [comment 注释], ... ) [row format delimited fields terminated by 指定分隔符];&#xff0…

深度学习之基于YoloV5血红细胞检测识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习已经在许多领域中得到了广泛的应用&#xff0c;包括医疗健康领域。其中&#xff0c;YOLO&#xff08;You O…

App加固中的代码混淆功能,让逆向工程师很头疼

App加固中的代码混淆功能&#xff0c;让逆向工程师很头疼 “我想离开浪浪山。” 在数次尝试破解某个App 时&#xff0c;某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推&#xff0c;还原成一段段代码&#xff0c;方便破解。 比如给他们一个手机Ap…

行内样式、内部样式、外部样式

行内样式&#xff1a; 该元素的所在本行中使用style标记来写样式 内部样式&#xff1a; 在head标签中使用style标记来写样式 外部样式&#xff1a; 在head标签中使用link标记引用外部样式 注意优先级&#xff1a; 行内样式&#xff1e;内部样式&#xff1e;外部样式 代码…

ChatGPT简介及基本概念

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

传输层——— UDP协议

文章目录 一.传输层1.再谈端口号2.端口号范围划分3.认识知名端口号4.两个问题5.netstat与iostat6.pidof 二.UDP协议1.UDP协议格式2.UDP协议的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 一.传输层 在学习HTTP等应用层协议时&#xff0c;为了便于理…

JMeter JDBC请求---操作MySql数据库

准备&#xff1a; 1、MySql的驱动jar包&#xff1a;mysql-connector-java-5.1.28.jar&#xff0c; 2、jmeter安装目录中修改编码格式&#xff1a;\bin\jmeter.properties &#xff1a;sampleresult.default.encodingUTF-8 3、连接数据库的连接地址、用户名、密码以及操作s…

在test用户下创建test1表并插入数据,然后将tes1t表的查询权限授予test2用户

文章目录 1、以 test 用户登录2、创建 test1 表3、插入数据4、查看数据5、授予权限创建用户test2以 test 用户登录并授予权限&#xff1a;使用test2用户登录查询&#xff0c;测试结果 1、以 test 用户登录 首先&#xff0c;您需要以 test 用户登录到数据库 sqlplus test/1232…

RocketMQ 分布式事务消息实战指南:确保数据一致性的关键设计

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…