idea插件开发
前两天遇到一个好玩的事,我的前前前。。。公司的同事,做了一个他们的软件产品介绍的直播,然后中间他有用到ecplise自定义了插件,做一个文件的转换,看起来好像挺好玩的。于是我就想,idea市面上也有很多的插件,我也想自己做一个玩玩。说干就干,开搞,菜鸡就是爱玩!!!
一:idea插件和jdk版本问题
idea更新迭代频率还是挺高的,基本每个月都会有更新,所以我们在开发idea插件时,jdk也会有所要求。
本人配置如下:
idea:2022.2.1;jdk:11.0.16.1
二:开发前准备
在idea本身的插件管理中,安装:Plugin DevKit;
具体操作:左上角File->Setting->Plugins,搜索plugin dev就能看到对应的插件,直接安装插件(有些idea是已经自动安装了这个插件的)。
三:创建插件项目
具体操作:
1)File->New->Project…,
2)选择IDE Plugin(某些版本的idea是IDE Platform Plugin)
3)输入项目名称(例如:ideaPlugin),选择项目路径,Type选择Plugin,语言选择Java;
Group和Artifact自己定义,基本和spring项目一致。
4)JDK版本选择,按照上面的要求选择JDK11(如果版本不匹配,会报错)
四:项目配置
idea Plugin的项目是有Gradle管理的,并不是maven。所以在项目创建完成后,需要下载一个Gradle;在项目打开构建时,idea会自动帮你执行下载,但是应该需要翻墙的,所以下载会很慢,甚至失败。(就算翻墙了,有时候idea下载依然很慢,气死!!!)
下面提供一个手动下载的方法
1)找到项目的gradle目录下的gradle-wrapper.properties文件,直接复制distributionUrl的路径,然后在浏览器中直接访问这个路径下载(记得去掉\,并确保你的网络能正常访问这个地址。);
2)下载至本地之后,在文件夹中打开
3)然后,复制.zip文件,放入gradle的默认文件夹中;一般是在
C:\Users\xxx\.gradle\wrapper\dists\gradle-7.5-bin
,其中xxx为当前的Windows用的名称;
至此,gradle安装完成!
4)重新加载一下gradle项目。找到gradle操作框(如果之前有打开过maven项目,应该和maven的操作位置一样),点击Reload All Gradle Projects,等待gradle项目构建完成(和maven加载依赖类似)。
五:项目结构搭建
具体操作如下:
1)点击:File->Project Structure…
2)左侧选择SDKs,点击+号,选择Add Intellij Platform plugin SDK…
3)选择当前idea安装目录
4)点击ok,弹出sdk选择框,选择sdk11
点击ok,然后apply。
六:插件开发
插件功能类创建,两种方案:
方案一
在src.main.java.com.xxx包中,右键New->Plugin DevKit->Action;按照如图所示,输入自己的相关内容。
方案二:
1)手动新建一个Java class,然后继承AnAction,然后重写actionPerformed()方法;比如:FileConvertorAction类,
2)找到resource.META-INF目录下的plugin.xml文件,在actions节点中,新建一个action(可以配置多个)节点,配置内容如下:
<idea-plugin>
<!-- 其他配置项... -->
<actions>
<action id="com.win.FileConvertorAction" class="com.win.FileConvertorAction" text="File convertor"
description="excel file convert to other files">
<!-- 指定父节点 action 或 action group 被添加到的位置 -->
<add-to-group group-id="HelpMenu" anchor="first"/>
</action>
<!-- 其他action配置项... -->
</actions>
</idea-plugin>
七:插件功能开发
在XXXAction类中的actionPerformed方法中,完成自己想要的功能:
public class Hello extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getData(PlatformDataKeys.PROJECT);
String txt= Messages.showInputDialog(project, "What is your name?", "Question", Messages.getQuestionIcon());
Messages.showMessageDialog(project, "Hello, " + txt + "!\nI am glad to see you.", "Information", Messages.getInformationIcon());
}
}
八:运行并调试插件
1)右上角直接启动,
2)项目启动后,会新打开一个idea的窗口(如果是第一次调试,会出现idea刚安装打开时的界面,会让你选择创建项目,或者打开项目等),选择open一个文件或者项目(这个不重要,关键是打开idea窗口);
3)点击Action新建时的菜单位置(我选择的是File),此时对应菜单下就会出现我们自定义的插件按钮名称(中文有可能乱码,后面给出解决方案)
这样,就完成了一个简单的插件功能。
九:其他问题
1)乱码问题:在build.gradle.kts中找到以下内容,并添加 options.encoding = “UTF-8”
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
//输出字符集
options.encoding = "UTF-8"
//其他配置
sourceCompatibility = "11"
targetCompatibility = "11"
}
2)gradle添加依赖问题:在build.gradle.kts中找到以下内容,并添加对应的依赖,
dependencies {
implementation("org.projectlombok:lombok:1.18.22")
implementation("com.alibaba:easyexcel:3.3.2")
}
我这里添加了lombok和easyExcel的依赖,其他的依赖参照上面的写好即可,然后Reload All Gradle Project;
3)插件开发完成后,安装至自己的idea:
1.在idea功能菜单中,Build->Build Project(如果已经调试过,应该已经build好了,可用跳过);
2.在项目的build.libs文件夹中,找到对应的jar包
3.将jar拷至自己电脑某个文件夹中(我直接放在桌面);
4.然后File->Setting->Plugins->Install Plugin from Disk
5.选择刚刚复制出来的插件jar包,点击ok;然后在Installed里面,就能看到刚刚自己开发的插件plugin
6.点击apply;然后等待idea自动加载完成。然后就能在当前的idea窗口看到插件了。
至于怎么删除插件,就不用我多说了吧!
十:插件上传
1)访问https://plugins.jetbrains.com/
2)登录,使用github账号或者其他支持的方式
3)上传插件,点击自己的用户名,选择Upload plugin
选择自己的插件jar包,
License选择apache 2.0
源码地址、标签、通道自己更具实际情况选择。
最后点击上传,等待审核完成即可!
注:待解决问题
插件控制台打印中文,出现了乱码,哭死!!!
尝试过以下方案:
1)修改Custorm VM Options,在里面添加
-Dfile.encoding=UTF-8
2)File->Setting->File Encondings;修改Project Enconding
3) 启动配置项:VM Options 添加配置(大小写都试过)
-Dfile.encoding=utf-8
Action源码
public class FileConvertorAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
Project project = anActionEvent.getData(PlatformDataKeys.PROJECT);
if (project != null) {
JPanel panel = new JPanel();
// 创建文件选择框描述符
FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false);
descriptor.setTitle("请选择一个文件!");
//过滤文件
descriptor.withFileFilter(file -> {
String extension = file.getExtension();
return extension != null && (extension.equals("xls") || extension.equals("xlsx") || extension.equals("XLS") || extension.equals("XLSX"));
});
// 添加文件选择框到面板
VirtualFile[] virtualFiles = FileChooser.chooseFiles(descriptor, project, null);
for (VirtualFile virtualFile : virtualFiles) {
try {
ExcelReaderBuilder read = EasyExcel.read(virtualFile.getInputStream());
String name = virtualFile.getName();
System.out.println(" =======>>>>>>> you select a file :"+name);
Messages.showMessageDialog(project,"你选择了:"+name,"tips",Messages.getInformationIcon());
} catch (IOException e) {
throw new RuntimeException(e);
}
JLabel label = new JLabel(virtualFile.getPath());
panel.add(label);
}
// 显示带有文件选择框的自定义弹窗
Messages.wrapToScrollPaneIfNeeded(panel,6,6);
}
}
}
运行效果
控制台打印
望大佬指点。。。