是五月呀!

IDEA插件开发(一)环境搭建与第一个工程

环境搭建

官方推荐使用社区版IDEA开发插件,因为方便调试核心代码。

You may use IntelliJ IDEA Ultimate as an alternative, but debugging the core code will only work with the Community Edition.

我下载的版本是

1
2
IntelliJ IDEA 2018.2.4 (Community Edition)
Build #IC-182.4505.22, built on September 18, 2018

那么在IntelliJ IDEA Community Edition 下载对应版本的源码,解压后为intellij-community-182.4505

首先需要创建一个IntelliJ Platform SDK。
打开项目配置窗口,File | Project Structure,选择SDKs,点击添加按钮,选择IntelliJ Platform Plugin SDK:

默认使用弹出的IDEA社区版根目录即可,点击打开:

然后会让选择JDK版本,使用1.8:

最后给SDK配置源码路径,选择Sourcepath,点击加号添加,选择刚才下载解压的intellij-community-182.4505文件夹,添加全部源码:

这样,开发IDEA插件的SDK环境就创建好了,注意其中有个路径是Sandbox Home,即沙箱位置:/Users/damon4u/Library/Caches/IdeaIC2018.2/plugins-sandbox
我们在运行插件时,IDEA会再运行一个沙箱环境IDEA,因为IDEA本身也就是一个java环境,这个路径会存放沙箱环境的配置数据,如果发现调试过程中出现类似缓存现象,新特性不生效,那么可以手动删除这里的数据。

第一个工程

创建工程时选择IntelliJ Platform Plugin:

新创建的工程结构如下:

src目录下放置源文件,plugin.xml用来注册组件。

下面创建一个官方给的简单例子,在菜单栏添加一个选项,点击后弹出一个窗口。
首先需要创建一个Action,继承AnAction类。通过实现actionPerformed方法实现功能。
右键创建一个Action:

然后输入信息:

  • Action ID:Action的唯一ID,推荐使用PluginName.ID
  • Class Name:创建的Action类的名字。
  • Name:标题栏中选项文案。
  • Description:可选,IDEA状态栏的提示文案。
  • Add to Group:Groups是Action要放到哪个组里,比如主菜单栏MainMenu,Window下拉菜单栏WindowMenu等。Actions和Anchor配合使用,可以选择放在下拉菜单中的开始,最后,或者某个已有选项的前面或者后面。
  • Keyboard Shortcuts:配置快捷键。

IDEA帮我们创建了一个SayHelloAction,我们需要实现actionPerformed方法:

1
2
3
4
5
6
7
8
public class SayHelloAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
// alter to say hello.
Messages.showMessageDialog("Hello!", "Information", Messages.getInformationIcon());
}
}

IDEA已经帮我们把创建的Action注册到plugin.xml中:

1
2
3
4
5
6
7
<actions>
<!-- Add your actions here -->
<action id="DemoPlugin.SayHello" class="com.damon4u.idea.action.SayHelloAction" text="Say Hello!"
description="A demo plugin to say hello.">
<add-to-group group-id="WindowMenu" anchor="first"/>
</action>
</actions>

这样第一个工程就写完了。点击运行按钮,启动沙箱环境。
在Window下拉菜单中点击我们的Say Hello选项,弹出提示框就算成功了。

关于Mac沙箱环境菜单栏触发问题

在Mac Mini(macOS High Sierra 10.13.6)运行插件时,点击菜单栏并没有反应,但是在MacBook Pro上运行时就没问题。
试着换了一下触发位置,比如绑定到generate弹窗中:

1
<add-to-group group-id="GenerateGroup" anchor="first"/>

也可以触发。
后来发现,沙盒环境下自带的菜单栏点击都没有反应。。。后来在Action is not triggered from main menu 中找到了答案。
在运行沙箱环境时,添加参数:

1
-Dapple.laf.useScreenMenuBar=false


这个参数是为了让Mac下的Java桌面程序的菜单栏不放到系统顶部,而是在应用自身顶部:

打包插件

插件开发好后,可以将它打包成jar包或者zip包(包含依赖类库),供别人使用。
选择 Build | Prepare Plugin Module for Deployment.
这样就会打包出一个jar包。
在插件中选择安装本地插件,就能使用了。

参考资料
官方文档Creating Your First Plugin