为了增加博客浏览量并提高用户粘性,方便我的读者们在工作之中摸鱼看文章。因此,我开发了一个 IntelliJ IDEA 插件 —— 博客助手插件(orange-assistant),它不仅支持博客内容的结构化查看,还集成了AI气聊天样式等功能辅助预览。
这篇文章将完整记录我从 0 到 1 开发该插件、构建自动化打包流程、发布到 GitHub 的实战经验,包括中间遇到的种种坑,以及解决的思路。
✨ 插件功能概览
博客助手插件主要解决两个痛点:
- 结构化预览:通过调用博客服务端接口,异步获取并展示文章列表,结合
JList
列表组件进行快速导航。文章阅读器:基于 JBCefBrowser
组件加载文章详情,直接在 IDEA 中浏览网页,模拟真实博客阅读体验。**AI对话 **:支持将特定格式的评论转换为“气泡式对话”样式,模仿朋友圈动态的展示方式,适合博主发布图文内容或教程合集。配图示意:
模块 | 功能点 | 截图 |
---|---|---|
博客文章 | 文章列表 | |
|____ | 文章搜索 | |
|____ | 文章查看 | |
AI | 对话展示 | |
|____ | 快捷功能 |
最终我设计的插件功能组件图如下:
🛠 功能开发中的挑战
1. 文章列表和详情
不同于简单的本地文件分析,博客列表是通过 HTTP API 获取后进行展示的,遇到了下列问题:
- 列表添加后需要再给
JList
刷新,我通过加签访问服务端后对返回数据进行解析,通过 Swing 做了列表可视化;文章详情页展示,因为我的博客文章都为 HTML 页,所以在 IDEA 插件中使用 JBCefBrowser
来实现文章页展示;无法在开发模式下展示 localhost 路径,必须输入全部 URL 路径,还通过 CefLoadHandlerAdapter
执行 JS 来调整文章页展示样式。2. 气泡 UI 渲染
- AI 聊天需要手动控制 UI 布局,重点问题:
- UI 不美观,聊天气泡和气泡尖角需自己控制圆角、边距、背景;UI 与 Swing 系统不符,需进行跨系统符合处理;AI 返回的 Markdown 结果需要用
Flexmark
转为 HTML,再通过自定义标签展示。3. LLM 搭建
既然是AI对话,那能少的了搭LLM呢,免费的flowise
搞一个:
这个工作量主要就是调试prompt了,可以参考我写的这篇文章:引导AI,探索无限可能:深入了解prompt, flowise我之前也讲过,可以下载插件后直接搜索关键字看相应文章
⚙ Gradle 打包与发布流程演进
最开始的打包方式遇到多个问题,逐步演进如下:
❌ 起初使用 build 直接 JAR 打包
第一次尝试构建后,得到的 plugin.jar
文件在本地测试时无法被 IDE 正确识别或安装。
- 原因:缺失依赖,或者未打入
plugin.xml
、资源文件等⚠ 使用 shadow
插件打包 fat jar
引入 com.github.johnrengelman.shadow
将所有依赖合并打包,但实际测试发现:
- 插件上传到 Marketplace 后运行时报错IDEA 插件平台对 JAR 内重复类资源较为敏感,容易触发
ClassNotFoundException
✅ 最终改用 Gradle 官方 distribution
插件
通过配置 distribution
插件,明确打包路径和 zip 名称:
distributions { main { distributionBaseName.set("orange-tech-${project.version}") contents { from("build/libs") { include("*.jar") } from("src/main/resources") // 如有额外资源 } }}
优点:
- 控制打包结构ZIP 命名清晰发布到 GitHub Release 不依赖额外插件
🚀 自动化构建与发布(GitHub Actions)
为了实现一套完整的自动构建与部署流程,我们配置了两套工作流:
🧪 Snapshot 发布(feature 分支)
触发时机:
on: push: branches: - 'feature-**'
核心逻辑:
- 检查版本是否为
-SNAPSHOT
执行 buildPlugin
+ distZip
使用 gradlew publish
发布到 GitHub Packages(需配置 credentials)常见问题:
- 发布失败:未指定 ZIP 位置版本号错误:非
*-SNAPSHOT
版本被误推送,Action 失败导致无法合并📦 正式发布(Release)
触发时机:
on: release: types: [published]
上传 ZIP 文件:
- name: Upload ZIP asset uses: actions/upload-release-asset@v1 with: upload_url: ${{ github.event.release.upload_url }} asset_path: build/distributions/orange-tech-${{ env.VERSION }}.zip asset_name: orange-tech-${{ env.VERSION }}.zip asset_content_type: application/zip env: VERSION: 1.0.4 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
注意:
env.VERSION
需在脚本前注入(使用 echo "VERSION=$VERSION" >> $GITHUB_ENV
)upload_url
仅在 Release 事件中存在,其他事件无效💡 AI 助力开发:从助手到加速器
整个插件开发过程,我也充分借助了 AI (chat gpt
、 豆包)的能力,成为提升效率、排雷避坑的重要方式。
chat gpt | 豆包 |
---|---|
- 配置调试助手:在 Gradle 构建、GitHub Actions 配置等流程中,通过 AI 快速定位错误点并生成可执行的 YAML、Groovy 脚本。设计优化建议:在插件 UI 渲染、架构模块划分等方向,AI 提供了多种实现思路,节省大量试错时间。文档与发布辅助:包括
plugin.xml
的编写、Release Notes 的组织,甚至这篇技术总结文章的结构和逻辑,也参考了 AI 的建议。AI 不再只是一个搜索引擎替代者,而是插件开发旅程中的“对话式编程伙伴”。它帮助我从“能做”更快走向“做得优雅”,未来我也将继续探索 AI 与本地开发工具的结合方式。
🔚 总结与建议
插件开发是对 Java Swing、Gradle 构建、GitHub Actions 自动化的综合实践。在这个博客助手插件项目中,我收获了以下几点:
- 🚧 插件功能设计要小而美,聚焦实际使用场景📦 Gradle 多种打包方式需权衡,最终选用 distribution⚙ 自动化流程必须分阶段(snapshot vs release),避免合并阻塞🧪 插件打包结构需真实测试,发布后再修复代价大
本项目完整源码与构建流程详见:
- 👉 GitHub 项目地址:github.com/shiker1996/…👉 插件地址:plugins.jetbrains.com/plugin/2746…
如有任何问题或建议,欢迎评论或 Issue,我会持续优化插件功能,并考虑未来提供便签等能力,关注我,一起变得更强!