点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | 木杉的博客

来源 | http://imushan.com

写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件。

要是这个操作是你们的编码环境特有的,那就只能自己写工具了。所以这里来学学如何编写IDEA插件,让自己的编程环境更加强大,更好的进行装逼。

开发环境

开发IDEA插件有以下这些依赖:

  • IntelliJ IDEA Community Edition

  • IntelliJ IDEA Community Edition 源码

  • Plugin DevKit 插件

  • IntelliJ Platform SDK

安装IntelliJ IDEA Community Edition

你可能已经安装了Ultimate版本,但是你还是需要安装[IDEA][]的社区版本。因为商业版是闭源的,所以在调试时无法调试核心代码。

下载IntelliJ IDEA Community Edition源码

社区版的安装包里是不包含源码的,所以我们需要手动从github上clone一份:

git clone --depth 1 git://git.jetbrains.org/idea/community.git idea

关于从源码运行IDEA的方法参考 Check Out And Build Community Edition:

http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html

添加IDEA jdk

虽然不知道原因,但是根据Check Out And Build Community Edition:

http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html

我们需要建立一个 IDEA jdk来运行插件:

除非你在Mac上使用官方JDK,否则你需要手动添加 /lib/tools.jar到classpath中。关注微信公众号:匠心零度,在后台回复:idea,可以获取我整最新 IDEA 教程,都是干货。

配置IntelliJ Platform SDK

打开 File|ProjectStructure新建一个 IntelliJPlatformSDK

Java SDK选择我们刚刚建立的 IDEA jdk

然后我们可以把下载的IDEA社区版源码添加到源码路径中,这样在调试时,就可以调试IDEA自身的代码了:

第一个插件

我们来编写一个最简单的插件来学习编写一个插件的完整步骤。

新建工程

选择 IntellJPlatformPlugin,然后Project SDK指定刚刚新建的plugin sdk:

新建的插件项目:

插件根目录下有两个目录 srcresourcessrc是插件代码目录, resource是插件资源目录,其中 META-INF/plugin.xml是插件的描述文件,就像Java web项目的 web.xml一样。

plugin.xml默认的内容如下:

<idea-plugin>  <id>com.your.company.unique.plugin.id</id>  <name>Plugin display name here</name>  <version>1.0</version>  <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>  <description><!\[CDATA\[Enter short description for your plugin here.<br>  <em>most HTML tags may be used</em>  \]\]></description>  <change-notes><!\[CDATA\[Add change notes here.<br>  <em>most HTML tags may be used</em>  \]\]></change-notes>  <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/build\_number_ranges.html for description --><idea-version since-build="145.0"/>  <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/plugin\_compatibility.htmlon how to target different products --><!\-\- uncomment to enable plugin in all products<depends>com.intellij.modules.lang</depends>  --><extensions defaultExtensionNs="com.intellij">  <!\-\- Add your extensions here --></extensions>  <actions>  <!\-\- Add your actions here --></actions>
</idea-plugin>

新建一个Action

插件扩展IDEA最常见的方式就是在菜单栏或者工具栏中添加菜单项,用户通过点击菜单项来触发插件功能。IDEA提供了 AnAction类,这个类有一个虚方法 actionPerformed,这个方法会在每次菜单被点击时调用。

新建一个自定义的Action有两个步骤:

1、 继承 AnAction类,在 actionPerformed方法中实现插件逻辑 2、 注册action,有两种方式,通过代码注册和通过 plugin.xml注册

我们先写一个简单的Action类:

publicclass TextBoxes extends AnAction {  // 如果通过Java代码来注册,这个构造函数会被调用,传给父类的字符串会被作为菜单项的名称// 如果你通过plugin.xml来注册,可以忽略这个构造函数public TextBoxes() {  // 设置菜单项名称super("Text _Boxes");  // 还可以设置菜单项名称,描述,图标// super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png"));}  public void actionPerformed(AnActionEvent event) {  Project project = event.getData(PlatformDataKeys.PROJECT);  String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon());  Messages.showMessageDialog(project, "Hello, " \+ txt + "!\\n I am glad to see you.", "Information", Messages.getInformationIcon());  }
}

然后我们在 plugin.xml中注册这个Action:

<actions>  <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu">  <add-to-group group-id="MainMenu" anchor="last"  />  <action id="Myplugin.Textboxes"class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" />  </group>
</actions>

这里我们新建了一个菜单组,其中text字符串的下划线表示这个字母作为快捷键。这个菜单显示的效果如下:

除了手动新建Action,IDEA还提供了快速新建的方法,在代码目录上点击新建,可以看到Action:

可以在这个面板中填写你要新建的Action信息,IDEA会帮你新建类,还有在plugin.xml中帮你注册:

运行插件

运行插件特别简单,和运行普通Java代码一样,点击运行或者调试的按钮,就会启动一个新的IDEA实例,这个实例中插件是生效的。

点击Text Boxes就可以看到插件的效果了。

往期推荐

Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置

面试:你知道Java中的回调机制吗?

两种写法的效果一样,那么到底哪一种更好呢?

StackOverflow 上面最流行的 7 个 Java 问题!

MySQL百万级、千万级数据多表关联SQL语句调优

以为是行废代码,原来有这作用!

欢迎加入我的知识星球,聊聊技术、说说职场、扯扯社会。

头发很多的中年程序员DD在这里期待你的到来!

加入方式:长按下方二维码噢

最近更新

【技术圈】关于Consul作为注册中心的四种形态演变

【技术圈】配置中心除了存储应用配置之外,适合做其他配置的存储吗?

【社会人】老实工作没有其他收入,为什么还要补缴个税?

【社会人】除了年终汇算清缴之外,今年的另一件大事:LPR

【聊职场】过来人说说银行科技怎么样?值得进去吗?

我的星球是否适合你?

点击阅读原文看看我们都在聊啥

自己动手,丰衣足食:从零开始写个 IDEA 插件,要啥功能就做啥!相关推荐

  1. 动手自己写一个 xcode 插件(Xcode Source Editor Extensions)附源码

    2019独角兽企业重金招聘Python工程师标准>>> 动手自己写一个 xcode插件  (暂时需要注释功能,所以简单的写一个注释插件) -----Xcode Source Edit ...

  2. 【Java EE】从零开始写项目【总结】

    从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等- 被虐得不要不要的,即使是非常简单有时候绕 ...

  3. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  4. 从零开始写项目第七篇【搭建Linux环境】

    tags: 从零开发项目, title: 从零开始写项目第七篇[搭建Linux环境] 使用SSH连接Linux环境 经过十多天的时间,我的网站备案终于完成了...接下来我就收到了阿里云的邮件.它让我在 ...

  5. 从零开始开发 VS Code 插件之 Translator Helper

    本文目录 Translator Helper 介绍 开发概述 创建第一个VS Code Extension 需求分析 操作文本 调用Google Translation API 实现核心功能 配置命令 ...

  6. 从0开始编写dapper核心功能、压榨性能、自己动手丰衣足食

    我偶然听说sqlsugar的性能比dapper强.对此我表示怀疑(由于我一直使用的dapper存在偏见吧),于是自己测试了sqlsugar.freesql.dapper发现他们的给我的结果是 sqls ...

  7. xlnt踩坑记2_自己动手丰衣足食

    可以参考鄙人上一篇博客 xlnt踩坑记1 然后就这样我爆肝一下午之后终于搞到了xlnt库,他的dll和lib 我开始认识到了--当我开始搞一些比较偏的Project的时候,真的就要靠 自己动手丰衣足食 ...

  8. 从零开始写一个抖音App——Apt代码生成技术、gradle插件开发与protocol协议

    1.讨论--总结前两周评论中有意义的讨论并给予我的解答 2.mvps代码生成原理--将上周的 mvps 架构的代码生成原理进行解析 3.开发一款gradle插件--从 mvps 的代码引出 gradl ...

  9. 骚操作 !IDEA 防止写代码沉迷插件 !

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! ‍ 原文地址:juejin.cn/post/6914083 ...

最新文章

  1. 《Cell》新发现!“第二大脑”的反击
  2. 汉芯一号、木兰语言再到天赐 OS,国产基础软件十年泣血,梦想何圆?
  3. Haha!Sniffer Pro终于可以用啦~
  4. Mybatis查询可能为null
  5. 用DriverStudio开发USB驱动程序
  6. python对文件夹内文件去重
  7. 2013年5月7日---JS中的正则
  8. 连接真机开发安卓(Android)移动app MUI框架 添加购物车等——混合式开发(四)
  9. 用户行为变迁 行业垂直深耕——疫情下的2020年移动互联网报告
  10. maven的系统变量设置
  11. go 正则表达式分组匹配_Go语言正则表达式用法实例小结【查找、匹配、替换等】...
  12. SAP License:FI中的表连接与应用
  13. CENTOS7 修改 网卡名称为eth0的配置方法
  14. 20165237 2017-2018-2 《Java程序设计》第8周学习总结
  15. Atitit Cookie安全法 目录 1. cookie分为 会话cookie 和 持久cookie , 1 1.1. 安全措施 1 1.2. 3. cookie的同源策略 2 1.3. 安全类库
  16. 疫情在家办公,向日葵突然卡死,无法远程电脑的解决办法(局域网远程强制重启windows)
  17. Linux文件与目录常用操作
  18. 人工智能粒子群优化和群智能
  19. kubernetes挂载glusterfs遇到的问题
  20. 什么是短视频电商,短视频电商的商业模式标题】

热门文章

  1. 服务发现存储仓库 etcd 使用简介
  2. pyInstaller 参数简介
  3. linux ubuntu gcc编译 fatal error: bits/libc-header-start.h 错误解决
  4. 在 Windows 上像 Linux 一样使用命令
  5. KVM 实现机制---(很經典)
  6. C C coding rule Using Directives Must Be Placed Within
  7. mongo java client_mongodb java客户端的使用,即MongoClient
  8. 北京科技大学C语言程序设计,北京科技大学《C语言》第1章.ppt
  9. 微型计算机应用重点,微型计算机原理以及的应用考试重点.doc
  10. 手动生成token_手动设计简单的Token验证