内容1.前言2.提出的问题3.开发插件遇到的问题4.开发插件MyToolWindowFactory4的两种配置。插件.xml5。测试结果6.插件开发无所不能1.快速生成CRUD工程代码2.IDEA里和鱼聊天3.可视化流程安排你觉得肯德基全家桶怎么样?全家人一起吃的一桶,就一点点?不,肯德基全家桶说的是鸡肉全家桶!听这个故事就像有时候因为需要解决某些问题去搜索、折腾、验证、淘汰技术方案,因为方向不对,所有的努力都会白费。你只能从海量的资料、文档、源码中一点一点的寻找和组合适合自己问题场景的技术方案。但这个过程有时是必须要经过的。很难在第一时间找到正确的答案或人。就算一开始找到了,也会去查其他的资料,看看有没有更好的。不,这是你,对吧?二、抛出问题我准备重新开发IDEA插件!学习了字节码插桩的相关技术后,我在考虑通常在代码上线后使用的非侵入式监控,另外在开发阶段提取系统接口是否也可以用于研发?有了这个冒出来的想法,我想如果要处理这件事,核心问题是开发一个IDEA插件+字节码插入能力,增强代码运行时的运行方式,以及提取相关必要信息。且不说案例真的做了,如下:案例地址:基于IDEA插件开发和字节码检测技术,研发交付质量自动分析后续问题:其实这里的实现只能算是一个案例,对于IDEA插件开发的能力没有完全了解。比如这个IDEA插件需要做一些基本的配置,那么在哪里打开呢?实时监控和生成的界面信息是否可以显示在IDEA界面右侧或者支持导出?如果我再引入一些集成IDEA插件开发能力的其他功能呢?这里使用了哪些技术?等等,这些问题需要一个一个解决,才能完整开发出一个可用的IDEA插件,需要做更深入的资料整理和实践验证。三、开发插件涉及的问题问题总结:开发一个IDEA插件的基本流程如下:开发方法:在官网的描述中,有两种创建IDEA插件项目的方法,即,IntelliJPlatformPlugin模板创建和Gradle构建方法。框架入口:开发出一个IDEA插件后,需要考虑嵌入到哪里,比如从IDEA窗体的Edit、Tools等进入配置,或者嵌入窗体到左右工具栏或者IDEA窗体下的对话框。UI:我想的是表单需要用什么语言开发,是的,我用的是Swing和Awt的技术能力。API:在IDEA插件开发中,一般都是围绕项目进行的,所以基本上需要从IDEA插件JDK开发能力中获取项目信息、类信息、文件信息等。Externalfunction:这个是用来和外部系统结合插件能力的,比如是否需要将获取的接口上传到服务器,或者远程下载文件等。4.开发插件的两种配置官方文档:https://plugins.jetbrains.com/docs/intellij/disposers.html官方案例:https://github.com/JetBrains/intellij-sdk-docs1。基本配置IntelliJIDEA2019.3.1x64JDK需要配置IntelliJPlatformPluginJDK,在ProjectSetting中设置,这样IDEApluginid'org.jetbrains.intellij'version'0.6.3'gradle-5.2.1和2019IDEAversion可以正常开发插件开发匹配Settings->Build,Execution,Deloyment->BuildTools,配置Gradle。Gradleuserhome=D:/ProgramFiles(x86)/gradle/gradle-5.2.1/.gradleUserGradlefrom=gradle-wrapper.properties或指定位置如下图:如果你使用IDEA默认的IntelliJ平台新建ProjectPlugin方法,其实只关注步骤1和2,但是如果需要Gradle,需要注意步骤3、4、5的设置。当然通常还是推荐使用Gradle来构建projects,这样当你需要一些额外的Jar包时,只需要在Gradlebuild.gradle中配置即可,而不用将需要的Jar包复制到项目的lib中。2.遇到的问题使用Gradle构建项目后,你会遇到几个问题;提前下载并配置Gradle5.2.1,否则构建项目自动下载会比较慢https://gradle.org/next-steps/?version=5.2.1&format=all时拉取相关内容会比较慢建设一个项目。如果有代理就更好了。【麻烦问题】基于Gradle的IDEA插件开发构建过程中,会下载配套版本的IDEA软件启动测试开发插件,压缩包ideaIC-2019.3.1.zip几百兆.这时候基本会遇到崩溃错误Couldnotresolveallfilesforconfiguration':detachedConfiguration1'。怎么办,不嫌麻烦的话,可以手动下载,把下载的文件用SHA1加密,放到缓存文件夹里。gradle\caches\modules-2\files-2.1具体操作如下:打开系统盘下当前用户的.gradle目录,进入.gradle\caches\modules-2\files-2.1目录,其中是缓存文件的目录。这个目录就是你在build过程中报错的地址,CouldnotgetresourceD:\ProgramFiles(x86)\gradle\gradle-5.2.1\.gradle\caches\modules-2\files-2.1\com。jetbrains.intellij.idea\ideaIC\2019.3.1加密文件夹2dae8e50d4b0508cad2e680b53414f657954f390目录名(你的可能不是这样的),我去吧,这个应该是加密的,但是什么加密呢?了解后知道这是SHA1加密,而且是用SHA1加密文件生成的唯一字符串,但是windows上没有这个命令,网上SHA1太麻烦,还需要上传文件,所以我想到了JavaAPI,并通过githash命令行来完成。暂时将我们的文件ideaIC-2019.3.1.zip复制到该目录下。运行sha1sum.exeideaIC-2019.3.1.zip命令生成一个唯一的字符串(用于校验文件的完整性),这样就可以得到2dae8e50d4b0508cad2e680b53414f657954f390目录名。接下来在2019.3.1目录下新建目录2dae8e50d4b0508cad2e680b537954f,将ideaIC-2019.3.1.zip移动进去即可。【StackOverflow】Gradle在构建过程中消耗大量内存,可能会报错Javaheapspace。因此,也可以在IDEA项目根目录下新建一个文件gradle.properties,添加如下内容,更改gradleJvm参数org.gradle。jvmargs=-Xmx2024m-XX:MaxPermSize=512m不仅好用,而且构建成功。五、编写测试用例1、项目结构PluginGuide├──.gradle└──src├──main│└──java│├──HiClazz.java│├──MyDumbAwareAction.java│├──MySearchableConfigurable.java│├──MyToolWindowFactory.java│└──TestUI.java└──resources├──icons└──META-INF└──plugin.xmlHiClazz是继承AnAction的实现类,用于附加到表单在IDEA中,点击打开对应的页面MyDumbAwareAction和MyToolWindowFactory一起用来设置IDEA的底层窗体,和你看到的控制台输出信息的位置一样。MySearchableConfigurable,可用于在设置中配置表单。TestUI是基于Swing开发的窗体,在AnAction实现类中开启验证。plugin.xml是整个IDEA咖啡的配置文件,你所有的表单都会体现在这个配置文件中。2.AnActionpublicclassHiClazzextendsAnAction{@OverridepublicvoidactionPerformed(AnActionEvente){Projectproject=e.getData(PlatformDataKeys.PROJECT);PsiFilepsiFile=e.getData(CommonDataKeys.PSI_FILE);StringclassPath=psiFile.getVirtualFile().getPath();Stringtitle="HelloWorld!";Messages.showMessageDialog(project,classPath,title,Messages.getInformationIcon());}}测试在IDEA中读取鼠标停留在class文件中的信息。我们可以将这个AnAction配置到每个IDEA菜单中。3。;group.add(newMyDumbAwareAction("Login2"));group.add(newMyDumbAwareAction("Login3"));ActionToolbartoolbar=ActionManager.getInstance().createActionToolbar("ToolBar",group,false);setToolbar(toolbar.getComponent());}}//在IDEA底部添加一个页面toolWindow.getContentManager().addContent(ContentFactory.SERVICE.getInstance().createContent(newMyPanel(false),"First",false),0);}}在窗体中,如果要显示自己的窗体,需要开发相应的ToolWindowFactory实现类,这样才能显示自己的内容。这里的思路基本上就是Swing技术的开发方式。如果你不熟悉Swing,这部分内容会比较陌生。4.plugin.xml
