IntelliJ插件开发教程之新建项目
JetBrains公司系列产品IDEA、WebStrom、PyCharm、CLion、GoLand等都是基于IntelliJ Platform开发而成,掌握IntelliJ插件开发技能便能拥有提升开发效率的终极武器。本教程Demo源码请微信公众号“开发效率”进行获取。阅读原文
如果您是JetBrains产品的用户,那您一定要看看这篇文章:JetBrains IntelliJ支持自动切换输入法,写代码如丝般顺滑
新建项目
新建项目比较简单,操作路径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.htmlintellij { 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 Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html --><idea-pluginrequire-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. --><vendoremail="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 --><extensionsdefaultExtensionNs="com.intellij"></extensions></idea-plugin>
相关文章:

IntelliJ插件开发教程之新建项目
JetBrains公司系列产品IDEA、WebStrom、PyCharm、CLion、GoLand等都是基于IntelliJ Platform开发而成,掌握IntelliJ插件开发技能便能拥有提升开发效率的终极武器。本教程Demo源码请微信公众号“开发效率”进行获取。阅读原文如果您是JetBrains产品的用户,…...

解决SpringBoot中@RequestBody不能和Multipart同时传递的问题
问题描述 今天在做文件上传的时候,遇到了这么一个错误日志: Resolved[org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘multipart/form-data;boundary--------------------------771899451541318130280588;charsetUTF-8’…...

【华为OD机试模拟题】用 C++ 实现 - 统计匹配的二元组个数(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明统计匹配的二元组个数题目输入输出描述示例一输入输出说明示例二输入输出说明备注Code使用说明 参加华为od机试,一定要注意不要完全背诵代码&...
Vuex 面试题总结 的历史汇总!
一.vuex是什么?怎么使用?哪种功能场景使用它? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。简单来说就是:应用…...
Redis缓存更新策略与缓存穿透、雪崩等问题的解决
文章目录一、缓存更新策略1、三种策略2、策略选择3、主动更新的方案二、缓存存在的问题1、缓存穿透2、缓存雪崩3、缓存击穿三、解决缓存问题1、自定义分布式锁2、解决缓存穿透问题3、解决缓存击穿问题一、缓存更新策略 1、三种策略 内存淘汰:redis自带的内存淘汰机…...

OSI和TCP/IP网络模型细讲
文章目录一、OSI七层参考模型二、TCP/IP体系结构三、TCP/IP参考模型四、沙漏计时器形状的TCP/IP协议族五、两种国际标准对比相似之处不同之处一、OSI七层参考模型 OSI参考模型共分为7层,低三层面向通信,可用软硬件实现;高三层面向信息处理&am…...

【正点原子FPGA连载】第十九章FreeRtos Hello World实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十九章FreeRto…...

php mysql高校田径运动会成绩管理系统
第一章 引言 1 1.1 选题背景 1 1.2 编写目的 2 1.3 目标 2 1.4 功能需求 3 第二章 开发工具介绍 4 2.1 PHP 4 2.2 APACHE 5 2.3 MYSQL数据库 5 2.4 运行环境 WINDOWS XP 6 2.5 XAMPP 6 2.6 DREAMWEAVE8 6 2.7 EDITPLUS 7 第三章 需求…...
scrum敏捷项目管理软件三款
Leangoo领歌Leangoo是国产的一个项目管理软件,www.leangoo.com , 专门的Scrum敏捷开发工具,看板的管理方式,高度可视化。它支持敏捷开发全流程。从产品路线图-需求-迭代-缺陷-测试-上线。燃尽图,工作量,迭代…...

【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]
🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…...

西电编译原理期末核心考点汇总(期末真题+相关知识点)
文章目录前言一、正规式1.1 相关知识点1.1.1 正规式定义1.1.2 辅助定义1.2 历年真题二、二义文法2.1 相关知识点2.1.1 二义性概念2.2 历年考题三、全部短语、直接短语和句柄3.1 相关知识点3.1.1 短语,直接短语和句柄定义3.1.2 短语,直接短语和句柄例题3.…...

追梦之旅【数据结构篇】——详解C语言实现二叉树
详解C语言实现二叉树~😎前言🙌什么是二叉树?二叉树的性质总结:整体实现内容分析💞1.头文件的编写:🙌2.功能文件的编写:🙌1)前序遍历的数值来创建树——递归函…...

独家 | Gen-1——可以改变视频风格的AI模型
翻译:吴振东校对:张睿毅本文约1000字,建议阅读3分钟 本文简单介绍了Runway公司的发展史,以及他们新推出的生成式AI模型Gen-1,可用于通过应用文本提示或者参考图像所指定的任意风格,将现有视频转换为新视频。…...

戴尔dell inspiron-5598电脑 Hackintosh 黑苹果efi引导文件
原文来源于黑果魏叔官网,转载需注明出处。硬件型号驱动情况主板X99 K9 v2 Machinist处理器i5-10210U / *i7-10510U已驱动内存20GB已驱动硬盘1000GB SAMSUNG 860 QVO SATA已驱动显卡Intel UHD 620已驱动声卡Realtek ALC3204/236已驱动网卡RTL8168H Gigabit Ethernet已…...

3.2 网站图的爬取路径
深度优先与广度优先方法都是遍历树的一种方法,但是网站的各个网页 之间的关系未必是树的结构,它们可能组成一个复杂的图形结构,即有回路。如果在前面的网站中每个网页都加一条Home的语句,让每个网页都能回到主界面,那么…...
《SQL基础》12. SQL优化
SQL优化SQL优化数据插入insert优化大批量插入数据主键优化order by优化group by优化limit优化count优化count用法update优化SQL优化 数据插入 insert优化 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。 批量插入手动控制事务主键顺…...
fork之后是子进程先执行还是父进程先执行
CFS(完全公平调度器)是Linux内核2.6.23版本开始采用的进程调度器,它的基本原理是这样的:设定一个调度周期(sched_latency_ns),目标是让每个进程在这个周期内至少有机会运行一次,换一种说法就是每个进程等待CPU的时间最长不超过这个…...
2023年java初级面试题(5道)
一、两个对象值相同(x.equals(y) true),但却可有不同的hash code,这句话对不对?答:不对,如果两个对象x和y满足x.equals(y) true,它们的哈希码(hash code)应当相同。Java对于eqauls…...

【内网安全】——Linux权限维持
作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 钱至少对于现在的我来说,的确是万能的在…...
Linux 真实使用内存计算
获取Linux内存信息,可通过cat /proc/meminfo查看,比如,Ubuntu 20.04.5 LTS上会显示以下信息: leoyaDESKTOP-LMR:~$ cat /proc/meminfo MemTotal: 16017572 kB MemFree: 15637472 kB MemAvailable: 15533140 kB Bu…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...