工作时,创建项目module时,总是有很多模板代码(公司内部框架的一些样板代码),配置起来感觉浪费时间,就开发了个插件。

主要介绍开发插件的几个步骤,不是很详细,但都是核心步骤。IDEA插件还有其他开发方式,例如主流的gradle构建项目,groovy等等。本项目很单纯,啥也没用,一个普通的插件项目,一堆正常的Java代码。

1、创建一个插件项目,配置插件的xml文件

idea 插件 kubernetes idea 插件开发文档_java

plugin.xml,按照自己情况填一填就行。插件介绍、作者、idea版本、更新日志、action。

2、创建插件action动作。本例是右键项目根目录,快捷生成一个满足要求module。

idea 插件 kubernetes idea 插件开发文档_intellij-idea_02


idea 插件 kubernetes idea 插件开发文档_xml_03

此时plugin.xml会自动添加一个action

idea 插件 kubernetes idea 插件开发文档_xml_04

3、Action开发,创建对话框,监听提交的数据

其实很简单,主要是之前没开发过,需要查资料。公司属于银行性质,太古板,限制了大量外网资源,增加了很多开发难度。
Action代码

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.psi.PsiDirectory;

public class PopViewAction extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        // 获取原项目信息
        PsiDirectory directory = e.getRequiredData(LangDataKeys.IDE_VIEW).getOrChooseDirectory();
        assert directory != null;
        String projectPath = directory.getVirtualFile().getPath();
        // 创建对话框,并监听数据
        OneDialog dialog = new OneDialog(e.getProject(), "对话框标题");
        dialog.show();
        // 业务处理(略)
        System.out.println(dialog.getVar1());
    }
}

对话框面板等开发

import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.awt.*;

public class OneDialog extends DialogWrapper {
    private String var1;
    private String var2;

    protected OneDialog(@Nullable Project project, String title) {
        super(project);
        init();
        setTitle(title); // 对话框标题
    }

    private JPanel center = new JPanel();
    private JPanel south = new JPanel();

    {
        setSize(600, 360); // 对话框大小
    }

    private final JLabel var1Label = new JLabel("下拉框");
    private final JComboBox<Object> var1Box = new JComboBox<>();
    private final JLabel var2Label = new JLabel("文本输入");
    private final JTextField var2Text = new JTextField();

    @Override
    protected @Nullable
    JComponent createCenterPanel() {    // 面板布局
        GridLayout gridLayout = new GridLayout(4, 1);
        center.setLayout(gridLayout);
        var1Box.addItem("下拉选项");    // 面板内容
        center.add(var1Label);
        center.add(var1Box);
        center.add(var2Label);
        center.add(var2Text);
        return center;
    }

    @Override
    protected JComponent createSouthPanel() {    // 定义Button,设置居中
        JButton button = new JButton("提交");
        button.setHorizontalAlignment(SwingConstants.CENTER);
        button.setVerticalAlignment(SwingConstants.CENTER);
        south.add(button);    // 事件绑定
        button.addActionListener(e -> {
            this.var1 = var1Box.getSelectedItem().toString();
            this.var2 = var2Text.getText();
            dispose();
        });
        return south;
    }

    public String getVar1() {
        return var1;
    }

    public void setVar1(String var1) {
        this.var1 = var1;
    }

    public String getVar2() {
        return var2;
    }

    public void setVar2(String var2) {
        this.var2 = var2;
    }
}

4、资源文件的读取

由于资源文件在插件的jar包中,普通的getResource是获取不到的。但可以采用xx.class.getClassLoader().getResourceAsStream()

字符流处理、解压缩等代码略

5、文档处理(这是我开发插件的目的,但是插件需求多种多样,这块反而不重要了)

按照各自需求处理就行,就是Java File操作。

内容替换,用的是字符流。都用了一个统一的字符流处理方法,运用简单正则表达式,将参数设置成队列。这样只要控制参数就行。

6、本地测试

效果如下图。

idea 插件 kubernetes idea 插件开发文档_idea 插件 kubernetes_05

7、打本地jar包

注意把插件用到的资源文件和jar包都打进去。右键resource目录,mark as root resource就行了。

如果插件没有引用jar包,打包出来是个jar包。如果引用了外部jar包,打包出来是个zip包,我们取zip包里的插件jar包即可。

idea 插件 kubernetes idea 插件开发文档_idea 插件 kubernetes_06

使用jar包,大家都会,拖到IDEA中就行。

右键使用插件功能,创建好module后,可以ctrl+shift+y刷新项目目录,项目maven会自动加载module。

8、使用私有仓库

使用本地jar包无法收到更新提示,私有仓库优于本地jar包。

idea 插件 kubernetes idea 插件开发文档_intellij-idea_07


updatePlugin.xml。文件放到线上,上图放入xml的下载地址。xml的url放入插件的下载地址。当插件更新时,更新版本号、changenotes就可以提示插件update。

<?xml version="1.0" encoding="UTF-8"?>
<plugins>
    <plugin id="cn.dop.simpleplugin" url="http://ip:port/mapping/SimplePlugin.jar" version="v1.0">
        <name>SimplePlugin</name>
        <idea-version since-build="193" until-build="221.*"/><!--版本范围-->
        <description><![CDATA[
          <p>
            一个朴实的插件。
          </p >
          <br/>
          <p>
            功能列表:
            <ul>
              <li>功能说明</li>
            </ul>
          </p >

          <p>
            如果您在使用过程中发现任何问题,请联系插件作者。
          </p >
          ]]>
        </description>
        <change-notes>
          <![CDATA[ 
          <p>
            <ul>
                <li>v1.0.0</li>
                <ul>
                    <li>版本说明</li>
                </ul>
            </ul>
            </p >
           ]]>
          </change-notes>
    </plugin>
</plugins>