【动手开发插件】虽然会报错,但是你就说能不能用吧!

200 阅读3分钟

背景

由于需求不断堆积,产品的很多代码都是“补丁”,没有结构,难于维护。所以老板决定利用几个月来让我们重构已有项目的代码,并且规范一下开发流程。这次重构面临着大量的接口文档的修改,我提出了使用yapi作为接口文档的想法,利用yapi基于注释的生成接口文档的方式,可以很快的生成接口文档,提高前后端对接效率。

我们目前的项目使用的框架是Micronaut,JDK版本是21,但是却发现yapi的插件——easy-yapi不支持Micronaut也不支持JDK21!!

QQ_1751098913029.png

无奈自己上手改造。

插件开发的辛酸泪

由于之前没有开发过插件,也没有写过kotlin,自己上手改造十分困难。虽然代码由Chatgpt几分钟就写完了,但是调试起来bug重重!经常是改了一个bug,又出现五个bug【捂脸笑】。

如何让插件支持Micronaut

这部分简单,由于easy-yapi支持Spring,直接将有关的Spring的代码丢给AI,然后“稍微”修改一下即可。

如何让插件支持Jdk21

这个问题让我想破脑袋了,由于插件是JDK17开发的,但项目是JDK21,导致在项目中一运行插件就直接报错。于是尝试直接将插件的版本升到JDK21,结果打包都失败了,挣扎了两天,最后找到了一种方案,升级Guice的版本

升级Guice版本后,还是有报错,但是可以丢到项目中成功运行了!

QQ_1751099845941.png

能跑起来了,但是没效果

插件能跑了,但是不输出文档!

无奈开始调试插件,使用命令

./gradlew :idea-plugin:runIde --debug-jvm

打开插件的调试模式,然后debug,此时会弹出一个新的idea,将项目丢进去,开始调试。

经过一顿挣扎以后,发现问题应该只会出现在两个地方:

  1. guice扫描失败
  2. spi机制失效

先排查第一个,打了半天的断点后,发现不对劲,如果Guice失败,那么其他的相关的注入也不应该有,应该直接空指针呀!遂排查第二个。

又经过一顿捣鼓,发现,果然是SPI机制失效了。明明自己将实现类写在配置文件中,害,您猜怎么着,就是找不着!!(写文章的今天,又排查了一天,还是不知道为啥失效)

QQ_1751100262576.png

又经过一天的捣鼓,彻底放弃了!!

问题出在hasApi,由于找不到实现类,这个方法一直返回false。

行行行,你厉害,那我直接让这个方法返回true,阁下又该如何应对?

成功运行

经过四天的捣鼓,插件成功运行,并且基本上支持Micronaut的常用注解,虽然有一点小瑕疵(插件打包时会报错,运行时不会报错),但是你就说能不能用吧!!

easy-yapi-micronaut

项目已经丢到了我的github上:

原项目:easy-yapi

改造项目:easy-yapi-micronaut

使用方式

将项目拉下来,使用打包命令,进行打包

 ./gradlew buildPlugin  

打好的包会在路径:.../idea-plugin/build/distributions/easy-yapi-2.8.1.212.0.zip下面

将插件使用本地插件的方式进行安装,并重启即可使用:

QQ_1751100752383.png

结尾

这次插件开发,说实话真算是我职业生涯比较痛苦的回忆了。因为一开始使用yapi作为接口文档是我提出来的,虽然yapi这个项目已经很老了,但是其可以通过注释导出接口文档的功能确实可以提效。

开发过程中一波几折,频频报错真的很消耗人的耐心,还好最后能够成功运行。

项目中的spi机制失效,我找了三天,但是目前还是没有找到,如果有人感兴趣能够找到其问题,我将十分感激!