最近想学习一下studio中的插件开发,下载安装IntelliJ IDEA,在运行插件工程,打包插件在studio中加载时出现了几个问题,此篇文章用来简单记录插件开发的过程和遇到问题的解决方法。

下载安装IntelliJ IDEA

点击官网根据版本进行下载,其中Community为免费版。
下载后进行安装,安装后点击启动IntelliJ IDEA。

开发插件的过程

新建一个插件工程

idea 插件 mongodb idea 插件开发文档_studio插件


点击next,如下:

idea 插件 mongodb idea 插件开发文档_插件开发_02


点击Finish,成功创建一个插件工程。

工程目录结构如下图所示:

idea 插件 mongodb idea 插件开发文档_studio插件_03

开发插件

成功创建插件工程后,会自动生成插件的配置文件plugin.xml,如下:

<idea-plugin>
  <!--插件id-->
  <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="173.0"/>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on 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></actions>
</idea-plugin>

在src下右击创建Action文件,负责插件开发的内容,是插件功能的入口,如下图所示:

idea 插件 mongodb idea 插件开发文档_idea 插件 mongodb_04


其中:

Action ID:代表这个Action的唯一标示。

Class Name:类名

Name:这个插件在菜单上的名称

Description:关于这个插件的描述信息

Groups:代表这个插件会出现的位置。比如想让这个插件出现在Code菜单下的第一次选项,图中选择CodeMenu(Code),右边Anchor选择First

Keyboard Shortcuts:快捷键设置。

创建完成后,生成了一个继承AnAction的Action文件,即MyTestDemoAction,实现方法actionPerformed,在这个实现方法中设置插件的开发内容,如下:

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;

public class MyTestDemoAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent event) {
        // TODO: insert action logic here
        Project project = event.getData(PlatformDataKeys.PROJECT);
        Messages.showInputDialog(
                project,
                "What is your name?",
                "Input your name",
                Messages.getQuestionIcon());

    }
}

此时相应的plugin.xml中会生成相应的Action信息,如下:

<!--依赖动作-->
  <actions>
    <!-- Add your actions here -->
    <action id="MyTestDemo.ID" class="test.MyTestDemoAction" text="MyTestDemoHelper" description="测试看看呢">
      <add-to-group group-id="CodeMenu" anchor="first"/>
    </action>
  </actions>

此时简单的插件开发的例子就完成了。

运行插件

点击Run plugin发生错误:

IntelliJ IDEA Class JavaLaunchHelper is implemented in both **One of the two will be used. Which one is undefined。

因为安装IntelliJ Idea会默认安装一个JDK,运行时会检测安装的所有的jdk版本,需要选择一个。

解决办法:

点击IntelliJ Idea最上面菜单的Help-Edit Custom Properties,没有这个properties文件的话,IJ会提示创建,然后在里面加上

idea.no.launcher=true

重启IntelliJ Idea。

可以在Project Settings中配置工程对应版本的jdk。

此时再次运行,会生成一个新的IntelliJ Idea窗口,在新窗口的菜单code中可以看到,如下:

idea 插件 mongodb idea 插件开发文档_ide_05


MyTestDemoHelper是插件名字,点击插件,如下:

idea 插件 mongodb idea 插件开发文档_studio插件_06


此时插件运行正常,开发工作完成。

在studio中运行插件

那怎么在studio中运行开发后的插件呢,需要插件的打包和安装:

插件打包

在开发的IntelliJ Idea中,点击build->Prepare Plugin Modelu “MyTestDemo” For Deployment,如下图所示:

idea 插件 mongodb idea 插件开发文档_插件开发_07


之后会在选择位置生成一个jar文件。

在studio中加载插件

在studio中,点击Preference->Plugins->Install plugin from disk…安装打包后的插件jar,然后重启studio,查看studio的菜单,如下:

idea 插件 mongodb idea 插件开发文档_studio插件_08


可以看到显示了对应的插件MyTestDemoHelper,点击MyTestDemoHelper没反应,并发现bug提示,如下:

null
java.lang.NullPointerException

查找资料发现解决方法:

在创建自定义的XXAction类时,需要保证自己的XXAction类在某个package中。

之后测试成功,如下:

idea 插件 mongodb idea 插件开发文档_插件开发_09


如果需要所有人都可以使用开发后的插件还需要插件的发布等等。

参考文档:

https://www.jianshu.com/p/b0c7218678d8 https://blog.xiaohansong.com/idea-plugin-development.html https://stackoverflow.com/questions/43003012/class-javalaunchhelper-is-implemented-in-two-places