【发布时间】:2021-02-27 06:02:07
【问题描述】:
我们有一个 Maven 多模块项目,其中包含大约 30 个子项目/模块。
使用这两个依赖项的所有子项目。 (这只是为了在示例中添加一些具体的东西)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra-reactive</artifactId>
</dependency>
因此,我们重构了这两个依赖项并将其放入父 POM。上面的 sn-p 现在处于父级。所有子项目仍然可以从中受益,并且只需将版本维护在一个地方,都非常高兴。
我们现在有一个适合业务用例并适合这个多模块项目的第 31 个项目,我们相信将它放在同一个父 POM 下是有意义的。
但是,这第 31 个项目不需要来自父 POM 的特定依赖项。 (在这种情况下是 Cassandra 依赖项,但问题是如何从父项中排除某些内容)
拥有此多模块的第 31 个项目部分,他还从父级获取此依赖项(Cassandra)。如何告诉这个子项目从父项目中排除这个依赖?
-
我不想完全提取此项目并将其与多模块分开。
-
我尝试在所有依赖项中添加一个排除项,但它仍然存在。就像我的孩子 pom 的所有依赖项一样,我这样写:
<dependency> <groupId>some.group</groupId> <artifactId>some.artifact</artifactId> <exclusions> <exclusion> <!-- declare the exclusion here --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-cassandra-reactive</artifactId> </exclusion> </exclusions> </dependency> -
我什至尝试进行疯狂的重构,将依赖项从父级移回所有子级,并为子级复制粘贴了 30 次,而我的第 31 个项目没有它。这行得通,但我相信还有比这更聪明的东西。
请问如何从父 POM 中排除一个特定的依赖项?
【问题讨论】:
-
使用dependencyManagement将版本保存在父pom中,并在需要它的子pom中移动实际使用情况。
-
谢谢@ThorbjørnRavnAndersen。但如果可能的话,这是我想避免的。我需要移动一个当前在父项中的依赖项,并且所有孩子都快乐地受益,向下移动到所有子项并在那里复制依赖项。可以只保留父 POM,但单独从一个孩子中删除它?
-
如本文所述:roytuts.com/…
-
使用
的缺点是你必须在子 pom 文件中重新声明所需的依赖项。 -
您只能通过欺骗 Maven 使用虚拟工件来避免它。这是生产代码的滑坡。这是您从父 Pom 重构依赖关系的机会。我会这样做 - 30 应该可以在 10-15 分钟内使用现代 ide。