如何正确处理Maven与OSGi/Tycho中快照版与正式版的版本排序?
问题背景
常规Maven项目里,1.0.0-SNAPSHOT快照版发布为1.0.0正式版后,Maven能正确识别正式版更新;但在Tycho构建OSGi bundle时,SNAPSHOT会被替换为时间戳格式的qualifier,生成类似1.0.0.202406220726的bundle版本。由于OSGi版本排序规则中,不带qualifier的1.0.0会被判定为比带时间戳的版本旧,导致用户无法从快照版直接更新到同核心版本的正式版。
标准处理方式
Tycho社区推荐的版本管理流程可以从根源解决这个问题:
- 正式发布前,将所有模块的开发版本(如
1.0.0-SNAPSHOT)升级为正式版1.0.0,完成发布流程。 - 发布完成后,立即将开发版本升级到下一个小版本的快照(比如
1.0.1-SNAPSHOT)。
这种方式下,后续开发生成的bundle版本是1.0.1.xxxx,自然比正式版1.0.0版本号更高,既符合Maven的版本逻辑,也满足OSGi的排序规则,完全避免更新障碍。
备选Workaround
如果无法采用标准流程,可根据项目情况选择以下方案:
1. 正式版添加特定Qualifier
将正式版版本设置为1.0.0.RELEASE,利用OSGi qualifier的字典序排序规则(RELEASE的首字母R码点高于数字),让1.0.0.RELEASE的版本优先级高于快照生成的1.0.0.2024xxxx。如果需要对外展示简洁的版本号,可通过Tycho配置在bundle的显示名称中隐藏qualifier,但需注意内部元数据仍会保留完整版本,避免混淆。
2. 奇偶版本号约定
采用偶数小版本作为正式版(如1.0.0、1.2.0),奇数小版本作为开发快照版(如1.1.0-SNAPSHOT、1.3.0-SNAPSHOT)。这样快照生成的bundle版本(如1.1.0.xxxx)高于上一个正式版,而下一个正式版(1.2.0)又高于快照版,保证更新路径顺畅。但需要团队严格遵守版本规范,适合长期迭代的项目。
对现有方案的点评
- 奇偶版本号模式:可行但有局限性,需要团队统一版本规则,版本号跳跃可能不符合语义化版本的常规认知。
- 发布后不升级快照版本:不推荐,Maven中
1.0.0-SNAPSHOT代表开发中版本,与正式版1.0.0逻辑冲突;若bundle同时作为普通Maven JAR发布,还会引发仓库依赖混淆问题。
内容的提问来源于stack exchange,提问作者Frettman

