Java项目中如何自动导入嵌套BOM的版本号?
问题分析与解决方案
你遇到的问题核心在于父BOM中third-party的声明方式是BOM导入(scope=import),而非普通的依赖版本管控。
Maven里,当你用<scope>import</scope>导入一个BOM时,Maven只会把这个BOM里的dependencyManagement内容合并到当前项目的依赖管理体系中,但不会把这个BOM自身的坐标(groupId:artifactId:version)加入到可被自动继承版本的依赖列表里。而api是直接在父BOM的dependencyManagement里以普通依赖形式声明的,所以你的项目引用时能自动拉取版本。
解决方法1:修改父平台BOM(推荐,符合BOM设计逻辑)
在父BOM的dependencyManagement里,除了保留原有的BOM导入声明外,额外添加一个不带scope=import的third-party pom依赖声明:
<dependencyManagement> <dependencies> <!-- 原有的BOM导入,用于合并third-party里的依赖版本 --> <dependency> <groupId>com.company</groupId> <artifactId>third-party</artifactId> <version>7.0.LTS.9</version> <scope>import</scope> <type>pom</type> </dependency> <!-- 新增:管控third-party自身的版本,让子项目可以直接引用 --> <dependency> <groupId>com.company</groupId> <artifactId>third-party</artifactId> <version>7.0.LTS.9</version> <type>pom</type> </dependency> <dependency> <groupId>com.company</groupId> <artifactId>api</artifactId> <version>7.0.LTS.9</version> </dependency> </dependencies> </dependencyManagement>
这样你的项目里直接引用third-party时,就能自动获取版本了。
解决方法2:在自己的项目中显式声明版本
如果无法修改父BOM,就在你自己项目的dependencyManagement里单独声明third-party的版本:
<dependencyManagement> <dependencies> <dependency> <groupId>com.company</groupId> <artifactId>platform-bom</artifactId> <version>7.0.LTS.9</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 单独声明third-party的版本 --> <dependency> <groupId>com.company</groupId> <artifactId>third-party</artifactId> <version>7.0.LTS.9</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
之后你在<dependencies>里引用时就不需要写版本了。
额外注意点
你写的依赖里<type>pom</pom>是标签闭合错误,应该改成<type>pom</type>,虽然这不是导致版本无法获取的直接原因,但会引发XML解析问题。
内容的提问来源于stack exchange,提问作者youknowwho
相关产品推荐
相关产品推荐

