多Jira插件能否复用源码?Spring Boot适配方案咨询
问题
我有两款功能、API近乎一致但UI不同的产品,为避免代码重复,希望复用同一套Java Spring Boot代码开发两款Jira插件。当前使用atlassian-connect-spring-boot-starter和atlassian-connect-spring-boot-jpa-starter,现有插件配置如下:
{ "key": "${addon.app1-key}", "baseUrl": "${addon.app1-base-url}", "name": "app1", "authentication": { "type": "jwt" }, "lifecycle": { "installed": "/installed", "uninstalled": "/uninstalled" }, "modules": { "generalPages": [ { "key": "landing-page", "location": "system.top.navigation.bar", "name": { "value": "app1" }, "url": "/collaboratorlogin", "conditions": [ { "and": [ { "condition": "user_is_admin", "invert": true } ] }, { "condition": "user_is_logged_in" } ] }, { "key": "admin-page", "location": "system.top.navigation.bar", "name": { "value": "Manage app1" }, "url": "/adminpage", "conditions": [ { "condition": "user_is_admin" } ] } ], "postInstallPage": { "url": "/home", "name": { "value": "Home Page", "i18n": "homepage.name" }, "key": "home-page" }, "webhooks": [ { "event": "jira:issue_created", "url": "/wh/issue_created" }, { "event": "jira:issue_updated", "url": "/wh/issue_updated" } ] }, "scopes": [ "READ", "ADMIN", "WRITE", "ACT_AS_USER" ] }
我希望新增一款类似的Jira插件,但atlassian-connect-starter对此存在限制,请问是否可以定制该starter以实现源码复用?
解决方案
完全可以通过定制atlassian-connect-spring-boot-starter或基于现有能力扩展来实现源码复用,以下是具体方案:
1. 无需定制starter:多环境配置+动态manifest加载
这是最轻量化的方案,不用修改starter源码:
- 为两款插件分别创建环境配置文件,比如
application-app1.properties和application-app2.properties,在其中定义各自的插件key、baseUrl、UI相关配置项(如页面名称、前端资源路径) - 修改
atlassian-connect.json模板,将所有差异化配置替换为占位符,比如${addon.app-name}、${addon.ui-resource-path} - 启动时通过
spring.profiles.active指定对应环境,Spring Boot会自动加载对应配置,渲染出不同的插件manifest - UI层面通过配置的资源路径加载不同的前端静态文件,后端业务逻辑完全复用
2. 定制starter:扩展配置类与manifest生成逻辑
如果需要更灵活的控制,可以修改starter的核心逻辑:
- 扩展
AtlassianConnectProperties类,新增多插件支持的配置属性,比如一个包含多个插件配置的列表 - 重写
AtlassianConnectManifestProvider类,根据当前激活的标识(比如请求头、环境变量)动态生成对应插件的manifest - 在starter中添加profile感知逻辑,自动识别当前要启动的插件实例,加载对应配置
3. 代码复用的额外优化
- 将业务逻辑、API接口、JPA实体等核心代码抽离到独立的模块(比如一个common jar),两款插件的工程都依赖该模块
- UI部分通过不同的前端打包产物,放在不同的资源目录,后端根据配置动态返回对应UI资源
- 生命周期接口(installed/uninstalled)、webhook逻辑可以复用,仅在需要差异化处理的地方通过配置判断分支
内容的提问来源于stack exchange,提问作者Karthik BS
相关产品推荐
相关产品推荐

