IDEA插件开发之实践篇

一、开发背景

平时在开发SpringBoot项目时,需要创建和实体类对应的 Respository,Service,ServiceImpl以及Controller类,同类文件格式基本一致,只是实体名称不一样。个人喜欢复制粘贴后再进行修改,然而偶尔一不小心手抖,检查也得半天。

所以出于代码能实现的绝不要自己费劲的偷懒原则,准备开发一款 IDEA 插件,能够实现最简版的自动创建实体对应文件的功能,以提高工作效率,改善编码心情。

二、开发步骤

1.开发环境

IDEA社区版(Community Edition)

特点: 完全免费,代码开源,但是缺少一些旗舰版中的高级特性。

推荐使用社区版而不是旗舰版,因为社区版是开源的,在开发插件的时候,有源代码调试会比较方便。

2.详细步骤

(1). 新建插件项目

在 IDEA 中选择 File -> New -> Project,点击 IntelliJ Platform Plugin,选择SDK,点击下一步:

在这里插入图片描述
(2). 给自己的插件起个好听的名字

在这里插入图片描述

创建好的工程目录结构:

在这里插入图片描述

(3). 修改 plugin.xml 的配置

<idea-plugin>
    <id>com.plugin.id</id>
    <name>CodeAutoCreate</name>
    <version>1.0</version>
    <vendor email="Your email address" url="http://www.yourco1mpany.com">Asiainfo</vendor>

    <description>This plugin can help you create entity-related files</description>
    <idea-version since-build="173.0"/>

    <extensions defaultExtensionNs="com.intellij">
        <!-- Add your extensions here -->
    </extensions>

    <actions>
        <action class="plugin.MyAnAction" id="codeCreate" text="Entity Code Auto Create">
            <add-to-group group-id="WindowMenu" anchor="first"/>
        </action>
    </actions>

</idea-plugin>

配置项介绍:

  • actions配置所有的操作菜单;
  • MainMenu 是主菜单,和File,Help等菜单同级;
  • add-to-group下配置的是该 group 的子菜单;
  • EditorPopupMenu 是在代码区右键的弹出菜单;
  • 所有的菜单列表可以在resources.jar PlatformActions.xml下查看;
  • anchor 设置菜单所在位置,末尾,首位等。

(4). 实现 AnAction 的 actionPerformed 方法

package plugin;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import java.util.Map;

public class MyAnAction extends AnAction {
    
    

    private PsiDirectory workDir;
    protected Project project;
    protected PsiDirectory containerDirectory;

    @Override
    public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
    
    
        // 获取需要处理的entity类
        PsiClass aClass = this.getEditingClass(anActionEvent);
        if (null == aClass) {
    
    
            return;
        }
        // 如果没有被Entity注解,则不生成
        if (null == aClass.getAnnotation("javax.persistence.Entity")) {
    
    
            return;
        }

        // 获取当前实体所在目录的上级目录,需要严格按说明中的目录组织,其它目录不考虑
        workDir = aClass.getContainingFile().getContainingDirectory().getParentDirectory();
        Map<String, String> configMap = ConfigDispose.getConfigPath(project, aClass);

        // 自动创建服务文件
        ClassCreator.createServiceFile(workDir, project, aClass, configMap);
        // 自动创建服务实现文件
        ClassCreator.createServiceImplFile(workDir, project, aClass, configMap);
        // 自动创建控制器文件
        ClassCreator.createControllerFile(workDir, project, aClass, configMap);
        // 自动创建repository文件
        ClassCreator.createRepositoryFile(workDir, project, aClass, configMap);
    }

    public PsiClass getEditingClass(AnActionEvent anActionEvent) {
    
    
        // 获取当前项目
        project = anActionEvent.getProject();
        if (null == project) {
    
    
            return null;
        }
        // 获取当前的编辑器对象
        Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
        if (null == editor) {
    
    
            return null;
        }
        // 获取当前编辑的文件
        PsiFile psiFile = PsiDocumentManager.getInstance(anActionEvent.getProject()).getPsiFile(editor.getDocument());
        if (!(psiFile instanceof PsiJavaFile)) {
    
    
            return null;
        }
        PsiJavaFile javaFile = (PsiJavaFile) psiFile;
        // 获取JavaFile中的Class(一个文件中可能会定义有多个Class,因此返回的是一个数组)
        PsiClass[] classes = javaFile.getClasses();
        if (0 == classes.length) {
    
    
            return null;
        }
        containerDirectory = classes[0].getContainingFile().getContainingDirectory();
        return classes[0];
    }
}

(5). 插件运行调试

对运行参数进行设置:
在这里插入图片描述
填写名字,选择插件项目以及JRE路径:

在这里插入图片描述
设置好之后点击运行,此时会弹出一个新的IDEA窗口,我们可以在该窗口里选择新建或打开已有项目来调试我们的插件:

在这里插入图片描述

(6). 插件编译打包

点击 Bulid -> Prepare All plugin Modules For Deployment

在这里插入图片描述

编译完成后,在工程第一级目录下会生成一个 codeAutoCreate.jar:

在这里插入图片描述
(7). 安装插件

点击File -> Settings -> Plugins 右侧的设置按钮,选择 Install plugin from Disk,选择刚刚生成的 jar 包并点击确定:

在这里插入图片描述
(8). 运行插件

新建一个用于测试插件的 SpringBoot 项目,在java目录下创建 entity 包,new 一个 User 实体类并打开(也就是被编辑的类):

在这里插入图片描述

然后点击 Window 菜单,第一个子菜单就是我们生成的插件:

在这里插入图片描述

点击该菜单后,UserController,UserService,UserServiceImpl,UserRepository 文件就会自动生成了:

在这里插入图片描述

自动生成代码插件源码地址如下:
https://github.com/jichunyang19931023/codeAutoCreate

猜你喜欢

转载自blog.csdn.net/j1231230/article/details/108324263
今日推荐