文章摘要(AI生成)
为了提升博客的浏览量和用户粘性,笔者开发了一个名为“博客助手插件”(orange-tech)的IntelliJ IDEA插件。该插件提供了结构化的博客内容查看功能,并整合了AI聊天样式,方便用户在工作中轻松浏览文章。文中详细记录了从零开始开发插件、构建自动化打包流程到发布到GitHub的全过程,分享了在开发中遇到的各种挑战及解决方案,包括文章列表和详情的展示、UI渲染的美化、以及大型语言模型(LLM)的搭建等。此外,笔者总结了Gradle打包与发布的演进过程,并介绍了如何使用GitHub Actions实现自动化构建与发布。整个开发过程中,AI的辅助被充分利用,助力高效排错和优化设计。综上所述,这一插件的开发不仅是对多项技术的实践,也展示了AI在开发过程中的重要作用。
为了增加博客浏览量并提高用户粘性,方便我的读者们在工作之中摸鱼看文章。因此,我开发了一个 IntelliJ IDEA 插件 —— 博客助手插件(orange-tech),它不仅支持博客内容的结构化查看,还集成了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 项目地址:https://github.com/shiker1996/orange-assistant
👉 插件地址:https://plugins.jetbrains.com/plugin/27463-orange-assistant
如有任何问题或建议,欢迎评论或 Issue,我会持续优化插件功能,并考虑未来提供便签等能力,关注我,一起变得更强!
评论区