作者:小傅哥 博客:https://bugstack.cn
❝沉淀、分享、成长,让自己和他人都能有所收获!😜 ❞
不踩些坑,根本不是成熟的码农!
你觉得肯德基全家桶是什么?一家人一起吃的桶吗,就那么一点点?不是,肯德基全家桶说的是,鸡的全家桶!
听到这个故事就像有时候我因为需要解决某些问题去搜索
、折腾
、验证
、排除
的技术方案,因为方向不对,所以努力也就白费。只能一次次在众多的资料、文档、源码中一点点找到并组合出适合自己的问题场景的技术处理手段。
但这个过程有时候又是必须经历的,很少有时候能一次就找到正确的答案或者人,哪怕开始就找到了,也会再去排查下其他的资料,看看还有没有更好的。是不,这就是你吧?
我又要冲IDEA插件开发了!
在研究字节码插桩的相关技术后,🤔考虑着除了通常的用在代码上线后的非入侵式监控外,是不是也可以用于研发在开发阶段对系统接口的提取呢?
带着这个从脑袋中冒出的想法,想到如果要处理这个事情,最核心的问题就是开发一款IDEA插件+字节码插桩能力,在代码运行时对运行方法增强,提取相关的必要信息。别说案例还真做出来了,如下:
问题汇总:开发一个 IDEA 插件基本要涉及到的问题过程如下:
与 2019 IDEA 版本下的插件开发匹配
D:/Program Files (x86)/gradle/gradle-5.2.1/.gradle
User Gradle from =gradle-wrapper.properties
或者 Specified location
具体如下图:
如果你是使用 IDEA New Project 默认的 IntelliJ Platform Plugin 方式,其实只关注1、2两步骤就可以了,但如果你需要 Gradle,那么需要注意3、4、5步骤的设置。当然通常也更推荐使用 Gradle 来搭建工程,这样你在需要一些额外的 Jar 包时候,只需要在 Gradle build.gradle
配置即可,而不是把需要的 Jar 包复制到工程的 lib 下。
在使用 Gradle 构建项目后,你会遇到几个问题;
ideaIC-2019.3.1.zip
。这个时候基本你会遇到一个崩溃的报错 Could not resolve all files for configuration ':detachedConfiguration1'.
咋办呢,如果你不嫌弃麻烦可以手动下载并SHA1加密后把下载的文件放到缓存文件夹中 .gradle\caches\modules-2\files-2.1
具体操作如下:.gradle
目录,进入.gradle\caches\modules-2\files-2.1
目录,即为缓存文件的目录。这个目录是你的报错构建过程中的报错地址,Could not get resource D:\Program Files (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
也太麻烦了,还要上传文件,于是想到了Java的API,还有就是通过git hash
命令行来实现。把我们的文件ideaIC-2019.3.1.zip
先临时拷贝到这个目录。运行sha1sum.exe ideaIC-2019.3.1.zip
命令,生成唯一的唯一字符串(用来校验文件的完整性),这样就拿到这个2dae8e50d4b0508cad2e680b53414f657954f390
目录名2019.3.1
目录下,新建目录2dae8e50d4b0508cad2e680b53414f657954f390
,将ideaIC-2019.3.1.zip
移动进去即可。Java heap space
所以也可以 在IDEA项目根目录下,新建文件gradle.properties
,添加如下内容,变更gradle Jvm参数 org.gradle.jvmargs=-Xmx2024m -XX:MaxPermSize=512m
别说还挺好用,竟然构建成功了。PluginGuide
├── .gradle
└── src
├── main
│ └── java
│ ├── HiClazz.java
│ ├── MyDumbAwareAction.java
│ ├── MySearchableConfigurable.java
│ ├── MyToolWindowFactory.java
│ └── TestUI.java
└── resources
├── icons
└── META-INF
└── plugin.xml
public class HiClazz extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getData(PlatformDataKeys.PROJECT);
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
String classPath = psiFile.getVirtualFile().getPath();
String title = "Hello World!";
Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon());
}
}
public class MyToolWindowFactory implements ToolWindowFactory {
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
toolWindow.setToHideOnEmptyContent(true);
class MyPanel extends SimpleToolWindowPanel {
public MyPanel(boolean vertical) {
super(vertical);
DefaultActionGroup group = new DefaultActionGroup();
group.add(new MyDumbAwareAction("Login1"));
group.add(new MyDumbAwareAction("Login2"));
group.add(new MyDumbAwareAction("Login3"));
ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("ToolBar", group, false);
setToolbar(toolbar.getComponent());
}
}
// 添加一个页
toolWindow.getContentManager().addContent(ContentFactory.SERVICE.getInstance().createContent(new MyPanel(false), "First", false), 0);
}
}
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<toolWindow canCloseContents="true" anchor="bottom"
id="SmartIM"
factoryClass="MyToolWindowFactory">
</toolWindow>
<!-- 在Setting中添加自定义配置模版 -->
<projectConfigurable groupId="Other Settings" displayName="My Config" id="thief.id"
instance="MySearchableConfigurable"/>
</extensions>
<actions>
<!-- Add your actions here -->
<action id="HiId_FileMenu" class="HiClazz" text="HiName">
<add-to-group group-id="FileMenu" anchor="first"/>
<add-to-group group-id="MainMenu" anchor="first"/>
<add-to-group group-id="EditMenu" anchor="first"/>
<add-to-group group-id="ViewMenu" anchor="first"/>
<add-to-group group-id="CodeMenu" anchor="first"/>
<add-to-group group-id="AnalyzeMenu" anchor="first"/>
<add-to-group group-id="RefactoringMenu" anchor="first"/>
<add-to-group group-id="BuildMenu" anchor="first"/>
<add-to-group group-id="RunMenu" anchor="first"/>
<add-to-group group-id="ToolsMenu" anchor="first"/>
<add-to-group group-id="WindowMenu" anchor="first"/>
<add-to-group group-id="HelpMenu" anchor="first"/>
</action>
<action id="HiId_EditorPopupMenu" class="HiClazz" text="HiName">
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</action>
<action id="HiId_MainToolBar" class="HiClazz" text="HiName">
<add-to-group group-id="MainToolBar" anchor="first"/>
</action>
</actions>
启动运行
::runIde
运行界面
运行效果
在 GitHub 上搜索 IDEA 插件开发,一共有44页内容,https://github.com/search?p=41&q=idea%E6%8F%92%E4%BB%B6&type=Repositories 涉及到自动化测试、工程脚手架、API生成、生成数据库的DAO类、一些常用工具,当然还有一些比较有意思的,比如:摸鱼看书、听郭德纲相声、微信聊天、局域网聊天、英语翻译等等。这里我给大家列举几个,开阔开阔思路。
compileflow Process
引擎是淘宝工作流TBBPM
引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成java
代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。在阿里巴巴中台解决方案中广泛使用,支撑了导购、交易、履约、资金等多个业务场景。- END -