用gradle开发IDEA插件_gradle-intellij-plugin-程序员宅基地

技术标签: IDEA  idea  intellij idea  

之前维护过IDEA插件GenerateO2O (GenerateO2O - IntelliJ IDEs Plugin | Marketplace),主要用来解决在分层架构中,每一层的对象装换的问题,比如DTO转换成DO,或者反过来。这个其实在字段数量很多,而且大部分长得一样的时候非常消耗人肉时间,而且容易错漏部分字段。当然可以使用类似Dozer这类动态BeanMapper工具。 但是这类工具的转换工作是黑盒的,实际使用中还是存在挺多问题,后面就在规范中规定不允许使用这类工具。这个插件的初衷就是尽量减少维护机械代码的时间,提升编码效率。插件上线之后一直运行的不错,但是最近发现在新版idea(IDEA2020)上会报错 explicitly marked as incompatible ,并且被直接失效。

环境搭建:

      整个项目已经过去好多年了,之前开发方式是用的DevKit,jetbrain家自己的一套工具,整体还算方便,但是带来的问题是缺少依赖管理,如果你需要使用其他jar包就要一个个手动加入到插件工程里面,比较原始。现在jetbrain 已经推荐使用gradle 的方式来组织项目了,所以整体结构跨度比较大,加上原来的代码比较简单就一个文件,直接开了一个新的项目来管理。首先是要确保IDEA 已经装好了DevKit 和Gradle 插件。参考 Building Plugins with Gradle | IntelliJ Platform Plugin SDK ,新建一个Gradle工程。记得选中Platform Plugin,接着Next,输入项目名称点击Finish就完事了。

建完之后的工程差不多长这样:

核心配置:

首先要关注的是build.gradle,这里的配置很重要,因为很多关键的信息和运行环境都依赖这个配置。

plugins {
    id 'java'
    id 'org.jetbrains.intellij' version '0.7.3'
}

根据上面的文档配置gradle-intellij-plugin插件,最新版本可以查询 Releases · JetBrains/gradle-intellij-plugin · GitHub。  

intellij {
    plugins = ['com.intellij.java']
    version '2020.1.1'
    sandboxDirectory = "$project.buildDir/myCustom-sandbox"
}

因为IDEA2019版本之后将com.intellij.java 从默认基础底层剥离了(大概就是这么个意思吧),导致很多依赖java结构的psi接口都会找不到。所以这里很重要的是在intellij里添加上这块的依赖。同时注意这里的version指定了插件依赖的IDEA版本,这块也是后续运行沙箱环境使用的IDEA版本。配置完成后刷新一下依赖,这个时候会花较长时间去下载相应的依赖以及idea 虚拟环境,网上很多文章反馈网络差一点的会超时,然后就失败了。如果出现这种情况需要自己下载对应的文件并放到本地gradle的对应目录下。我下载的时候还行,稍微等了一会,最终还是下载好了。

    接下来就是开发了,在src main java 下新建一个action,然后开发自己的逻辑就行了。这里把原来的代码搬过来之后发现部分api调整了,好在psi的部分整体基本没有变动。

psi相关关的开发技巧:·

1.IDEA自带的PSI 查看器

在idea.properties 里面配置

idea.is.internal=true

 就可以在Tools菜单中看到

拿当前文件举例

你就能直观的看到都有哪些元素,这些元素分别负责什么,这对于你后面对这些结构进行组织有很大帮助。

2.psiViewer插件

这个是第三方开发的插件,能够跟上面那个插件很好的互补。他是能够方便的看到代码对应psi元素。上面的插件能够方面看到元素对应的代码范围。

运行调试:

利用gradle 直接debug runIde选项就可以debug,但是gradle 任务会先去下载一个JBR ,用于idea运行环境,可以参考 IDEA插件开发笔记001环境搭建(使用Gradle插件方式) - 一杯半盏 - 博客园

这个时候通常在当前的gradle 中是下载不成功的,可以通过浏览器执行下载。将下载的tar.gz文件放入本地的gradle的cache中 ,在本机上是

~/.gradle/caches/modules-2/files-2.1/com.jetbrains/jbre

然后重新启动,就不会需要再去下载了。

打包发布:

这里没有使用gradle 插件直接发布,因为需要配置账号密码,开源的一般不建议这么做。关于打包还有一个比较重要的配置是版本问题,我第一次打包的时候就出现了,打出来的包没办法用,提示版本不匹配。在build.gradle 中配置最低支持版本,和最高支持版本

patchPluginXml {
    //最低支持的版本
    //版本参考:https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html?from=jetbrains.org#intellij-platform-based-products-of-recent-ide-versions
    sinceBuild '201'
    //最高支持的版本,不能不设置,不设置是默认为 project.version
    untilBuild ''
    changeNotes """
      2.0版本.<br>
      针对2020版本的更新,主要修复了2020版本及更高版本报explicitly marked as incompatible的问题.<br>
      使用了新的gradle来创建插件.<br>
      """
}

这里要注意的是untilBuild 必须设置,不然就会使用project.version ,这样达不到我们希望最高支持版本不限制的目的。

总结:开发一个简单的插件还是挺容易的,网上也有比较多的入门文章,但是具体到一个比较可用的插件,这些入门文章还是远远不够的。这个时候就需要多参考官方的文档,这里不得不吐槽下官方文档的使用体验比较糟糕,一些问题还是从社区答疑里得到解决。

参考链接:

AS 自定义插件 总结 :AS 自定义插件 总结 [MD] - 白乾涛 - 博客园

IDEA插件开发:一个简单的表单demo :IDEA插件开发(一)一个简单的表单demo - 胖虎1993 - 博客园

IDEA插件开发教程: IntelliJ IDEA插件开发教程_纵横wan的博客-程序员宅基地_idea插件开发教程

IDEA插件开发视频教程: 42. IntelliJ IDEA 插件开发视频教程 - IntelliJ-IDEA-Tutorial

IDEA插件开发指南: https://www.yuque.com/xjt2016/xd2ir5

IntelliJ Platform SDK : IntelliJ Platform SDK | IntelliJ Platform Plugin SDK

IntelliJ Platform SDK 中文:IntelliJ Platform SDK / IntelliJ Platform SDK DevGuide  (有点机翻的味道)

IDEA 插件开发入门教程:IDEA 插件开发入门教程 - 掘金 (讲了一点进阶内容)

编写一个IDEA插件之:自动生成Java代码: 编写一个IDEA插件之:自动生成Java代码 - 知乎

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ykdsg/article/details/116748924

智能推荐

数据库Mysql+SSM技术开发,SSM 泰州市二手房交易平台系统--03401(上万套实战教程手把手教学,免费领取源码)-程序员宅基地

文章浏览阅读162次。关注●点赞收藏并私信博主,免费领取项目源码哦~总体设计主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等;详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。

【部署网站】使用nginx+tomcat部署博客网站_用nignx发布网站和用tomcat部署-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏16次。一、什么是静态网站、动态网站?静态网站没有采用任何程序开发,是纯粹使用html语言写出的网站,网页文件名以html或htm结尾。原则上不会受到攻击入侵,但是也无法在网络上实时更新内容,就纯粹的是制作好的页面。动态网站目前的主要开发语言有ASP,JSP,PHP,ASP.NET在制作好之后,都有一个网站管理后台,当以管理员身份登陆时,可以对网站的内容进行增删操作,直接在网上进行这些操作,虽然它可以随时更新,但是速度较慢。并且需要区分的是,动态网站的动态指的是动态实时更新而非网站有动态画面。区分静态网站和动_用nignx发布网站和用tomcat部署

android 实现定时任务,Android 实现定时任务的五种方式的讲解-程序员宅基地

文章浏览阅读3.9k次。1、普通线程sleep的方式,可用于一般的轮询Pollingnew Thread(new Runnable() { @Override public void run() { while (true) { //todo ..._android 定时20个小时

Dr_can模型预测控制笔记与代码实现-程序员宅基地

文章浏览阅读2.7w次,点赞206次,收藏552次。因而我们引入模型预测控制(Model PredictiveControl)的概念,对于一般的离散化系统(因为实际计算机实现的控制系统都是离散的系统,连续系统离散化的方法在此不述)。在k时刻,我们可以测量或估计出系统的当前状态y(k),再通过计算得到的u(k),u(k+1),u(k+2)...u(k+j)得到系统未来状态的估计值y(k+1),y(k+2)...y(k+j);我们将预测估计的部分称为预测区间(Predictive Horizon),将控制估计的部分称为控制区间(Control Horizon)_dr_can

由浅入深!小程序FMP优化实录,已拿offer入职_小程序fmp是指的什么(1)-程序员宅基地

文章浏览阅读569次,点赞25次,收藏12次。其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:架构师筑基必备技能Android框架体系架构(高级UI+FrameWork源码)360°Androidapp全方位性能调优设计思想解读开源框架NDK模块开发移动架构师专题项目实战环节移动架构师不可不学习微信小程序混合开发的flutterAndroid学习的资料我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

计算带余除法(四种方法)_带余除法怎么写编程-程序员宅基地

文章浏览阅读387次,点赞12次,收藏4次。给定两个整数a和b (0 < a,b < 10,000),计算a除以b的整数商和余数。一行,包括两个整数a和b,依次为被除数和除数(不为零),中间用空格隔开。一行,包含两个整数,依次为整数商和余数,中间用一个空格隔开。示例:输入:15 2,输出:7 1_带余除法怎么写编程

随便推点

数字化转型背景下的金融交易业务中台实践-程序员宅基地

文章浏览阅读140次。引言:目前金融业IT系统大多由业务部门或渠道进行竖井式建设,这种模式的好处是系统专业性强,但同时也给运营及IT管理部门带来分散性阵痛。那么如何在强监管与统一风控的形势下,实现统一管控、快速响应、应需而变、按期交付?中台架构就是在这种背景下应运而生。本文主要以某城商行基于BIIP实施的交易中台的实践案例展开分享,一起和大家探讨企业数字化转型中的背景、技术..._运营转型 业务中台

AWG标准_awg官方规范-程序员宅基地

文章浏览阅读1.5k次。AWG 直径 面积 铜阻抗 (inch) (mm) (kcmil) (mm²) (Ω/km) (Ω/kFT) 0000 (4/0) 0.46 11.684 212 107 0.1608 0.04901 000 (3/0) 0.4096 10.404 168 85 0.202..._awg官方规范

图像修复论文Residual Non-local Attention Networks for Image Restoration阅读笔记-程序员宅基地

文章浏览阅读2.8k次。论文来源:ICLR2019论文链接:pdf (openreview.net)_residual non-local attention networks for image restoration

表达式计算。问题描述:编写程序,计算并输出如下表达式的值:y=其中a,x,y均为float类型,取值为3.1415926。输出结果要求保留小数点后3位。_serialprintln(a)的结果为-程序员宅基地

文章浏览阅读153次。【代码】表达式计算。问题描述:编写程序,计算并输出如下表达式的值:y=其中a,x,y均为float类型,取值为3.1415926。输出结果要求保留小数点后3位。_serialprintln(a)的结果为

android 自定义Toast 吐司-程序员宅基地

文章浏览阅读274次,点赞3次,收藏8次。【Android 详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

FP-Growth算法之FP-tree的构造(python)_利用fpgrowth算法对其构造一个fptree,树的最大高度-程序员宅基地

文章浏览阅读7.4k次。前言:关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍。 本文主要介绍 FP-tree 的构造算法,关于伪代码请查看上面的文章。上接:FP-Growth算法python实现;下接:FP-Growth算法之频繁项集的挖掘(python)。 正文:tree_builder.py\color{aqua}{tree\_builder.py}文件:#coding=utf-8import_利用fpgrowth算法对其构造一个fptree,树的最大高度