工作时,创建项目module时,总是有很多模板代码(公司内部框架的一些样板代码),配置起来感觉浪费时间,就开发了个插件。
主要介绍开发插件的几个步骤,不是很详细,但都是核心步骤。IDEA插件还有其他开发方式,例如主流的gradle构建项目,groovy等等。本项目很单纯,啥也没用,一个普通的插件项目,一堆正常的Java代码。
1、创建一个插件项目,配置插件的xml文件
plugin.xml,按照自己情况填一填就行。插件介绍、作者、idea版本、更新日志、action。
2、创建插件action动作。本例是右键项目根目录,快捷生成一个满足要求module。
此时plugin.xml会自动添加一个action
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、本地测试
效果如下图。
7、打本地jar包
注意把插件用到的资源文件和jar包都打进去。右键resource目录,mark as root resource就行了。
如果插件没有引用jar包,打包出来是个jar包。如果引用了外部jar包,打包出来是个zip包,我们取zip包里的插件jar包即可。
使用jar包,大家都会,拖到IDEA中就行。
右键使用插件功能,创建好module后,可以ctrl+shift+y刷新项目目录,项目maven会自动加载module。
8、使用私有仓库
使用本地jar包无法收到更新提示,私有仓库优于本地jar包。
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>