idea 2020.2 如何设置classpath_开发属于自己的第一款IDEA插件!

72ab094ae2c8d6dd616831180c6b0d78.png

作者:木杉 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来运行插件:

970992b509de47071723dc08b3e83cbf.png

除非你在Mac上使用官方JDK,否则你需要手动添加/lib/tools.jar到classpath中。

配置IntelliJ Platform SDK

打开File | Project Structure新建一个IntelliJ Platform SDK

ee0e9bc95d011bfae8f410e2bfd97edf.png

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

71c0b89078f0b35e8be7552873dd18ec.png

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

49adfb473edcf290ad9f45790d3ed0b6.png

afbe6ef1e9afc04fa6e8bd6aeb3ad1ab.png

第一个插件

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

新建工程

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

d0551ff1aa5a2ed3b5265154fd90a357.png

新建的插件项目:

84fffd5db82746b1a6e7a824e4e00990.png

插件根目录下有两个目录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字符串的下划线表示这个字母作为快捷键。这个菜单显示的效果如下:

34665289d015294e15c8f4d0309c4a4d.png

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

8a01443e7db887e0c5aac0d69756c682.png

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

99c54b8c202e588086bee6d8542a204e.png

运行插件

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

参考资料

  • Setting Up a Development Environment
  • How to make an IntelliJ IDEA plugin in less than 30 minutes

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

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

相关文章

java中Arrays类和Math类常用API简介

Arrays类&#xff1a; java.util.Arrays是一个与数组相关的工具类&#xff0c;提供了许多静态方法对数组进行操作&#xff0c;直接通过类点出来使用&#xff0c;无需创建对象。 // 1.Arrays类存在与java.util下&#xff0c;需要导包&#xff1a; import java.util.Arrays; pu…

按15分钟取数据_Python爬取猫眼电影《飞驰人生》4万多条评论并对其进行数据分析...

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者&#xff1a; Yura不说数据说 &#xff0c;PYuraLPS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.c…

UI设计

摘要 源于ajlr项目的验收&#xff0c;过程中ui的设计被屡次提到。所以就有了这样一个思考&#xff0c;什么是ui设计&#xff1f;对于开发人员来说&#xff0c;ui设计是否很重要&#xff1f;以及如何来进行ui设计&#xff1f; ui设计&#xff1f; User Interface&#xff0c;简称…

Java中继承、this关键字、super关键字

继承: 概述&#xff1a;当多个类中存在相同属性和行为时&#xff0c;将这些相同的内容抽取到单独一个类中&#xff0c;那么多个类无需再定义这些属性和行为&#xff0c;只要继承抽离出来的这个类即可。 子类&#xff1a;当某个类继承了另一个类的时候&#xff0c;可以把这个某…

java中抽象类,abstract关键字

抽象类&#xff1a;java语法规定&#xff0c;包含抽象方法的类为抽象类。 abstract关键字&#xff1a;abstract用来定义抽象方法和抽象类&#xff0c;定义抽象方法格式为&#xff1a;abstract修饰方法&#xff0c;并去掉大括号&#xff0c;直接以封号结束&#xff1b;定义抽象…

c++获取当前时间戳_python开发:python时间模块的使用

前言&#xff1a;今天元宵节&#xff0c;祝福大家元宵节快乐。今天在元宵节给各位朋友分享一下python时间模块。我们在开发中经常会与时间打交道&#xff0c;如&#xff1a;获取事件戳&#xff0c;时间戳的格式化等&#xff0c;这里简要记录一下python操作时间的方法。ython中常…

Linux重新编译内核指南

Linux的一个重要的特点就是其源代码的公开性&#xff0c;全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中&#xff0c;由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。      为什么…

python 获取向上两级路径_Python学习第171课--相对路径和绝对路径

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】这节我们补充2个概念&#xff1a;相对路径和绝对路径。●绝对路径就像一棵大树一样&#xff0c;从它的根开始&#xff0c;往上会有大的枝干&#xff0c;在大的枝干上面又会有小一点的树枝&#xff0c;小树枝上面…

Java接口、implements关键字、接口中抽象方法,默认方法,静态方法,私有方法,常量、final关键字

接口&#xff1a; 接口是Java语言中一种引用类型&#xff0c;是方法的集合&#xff0c;如果说类的内部封装了成员变量、构造方法和成员方法&#xff0c;那么 接口的内部主要就是封装了方法&#xff0c;包含抽象方法&#xff08;JDK 7及以前&#xff09;&#xff0c;默认方法和…

百度热力图颜色说明_大数据下的龙港、鳌江人口热力图

大数据下的龙港、鳌江人口热力图--趋势显示&#xff0c;人口逐步集中于区域中心地区与城市 2020-08-25 大数据(big data)&#xff0c;是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据有五大特点&#xff0c;即大量(Volume)、高速(Velocity)…

python 显示图片matplotlib_Python OpenCV ——Matplotlib显示图片

Color image loaded by OpenCV is in BGR mode.But Matplotlib displays in RGB mode.So color images will not be displayed correctly in Matplotlib if image is read with OpenCV.Please see the exercises for more details.(引自文档)import numpy as npimport cv2from …

什么是Spring?Spring是什么?

Spring概述&#xff1a; Spring是一个开源框架&#xff0c;是为了解决企业应用程序开发复杂性而开发的。 从简单性、可測试性和松耦合的角度而言&#xff0c;不论什么java应用都能够从Spring中受益。 简而言之&#xff0c;Spring就是一个轻量级的控制反转&#xff08;IOC&#…

java中多态,instanceof关键字

多态&#xff1a; 面向对象三大特征&#xff1a;继承、封装、多态&#xff0c;其中多态指的是有多种形态&#xff0c;可以使代码更加灵活&#xff0c;而非状态。继承或接口是多态的前提&#xff0c;比如一个对象狗是宠物类的实现类对象&#xff0c;而宠物类又继承了动物类&…

python语言的单行注释以井号开头_【学习】Python语言入门

Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 语法 Python中没有强制的语句终止字符&#xff0c;且代码块是通过缩进来指示的。缩进表示一个代码…

python 参数个数 同名函数_Python——函数的参数

函数的参数定义函数的时候&#xff0c;我们把参数的名字和位置确定下来&#xff0c;函数的接口定义就完成了。对于函数的调用者来说&#xff0c;只需要知道如何传递正确的参数&#xff0c;以及函数将返回什么样的值就够了&#xff0c;函数内部的复杂逻辑被封装起来&#xff0c;…

webview的

问题描述我给WEBVIEW加了等待的圆圈,怎么不起作用?布局文件:<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:lay…

java中final关键字、权限修饰符、内部类(成员内部类、局部内部类、匿名内部类)

final关键字&#xff1a; final表示最终的不可变的&#xff0c;在java中可以用来修饰类或方法、局部变量、成员变量。 // 1.final关键字修饰类需要放在class关键字前面&#xff0c;表示不可变的类&#xff0c;需要注意&#xff0c;这里表示当前类不能有子类&#xff0c;但是有…

python安装后无法使用_Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)...

在终端通过pip装好包以后&#xff0c;在pycharm中导入包时&#xff0c;依然会报错。新手不知道具体原因是什么&#xff0c;我把我的解决过程发出来&#xff0c;主要原因就是pip把包安装到了“解释器1”&#xff0c;但我们项目使用的是“解释器2”。我们新手怕字多&#xff0c;所…

03-sizeof的用法

1、作用 sizeof运算符是C语言特有的运算符。 用来计算一个变量或者一个常量、一种数据类型在内存中所占的字节数。 2、基本形式 (1) sizeof (变量或常量) (2) sizeof 变量或常量 (3) sizeof(数据类型) (4) 不能是sizeof 数据类型, 即计算数据类型的字节数必须用小括号括起来 实…

java中类作为成员变量类型使用、接口作为成员变量类型使用、接口作为方法的参数或返回值使用

类作为成员变量类型使用&#xff1a; 自定义的类也可以作为成员变量使用&#xff0c;如&#xff1a; // 1.创建一个电脑角色的类&#xff1a; public class Computer{private String computername;//定义电脑名称&#xff0c;String类型底层实际就是一个类&#xff0c;是java…