【问题标题】:Multi-module project: Exclude a dependency from the parent pom多模块项目:从父 pom 中排除依赖项
【发布时间】: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。

标签: java maven


【解决方案1】:

我通常这样做的方式是使用多层次的 pom。

这意味着我有一个完整的父 pom 树,而不是一个只有一行非父 pom 的父 pom,它由一个 root-parent-pom 和几个级别的中间父 pom 组成作为它的子节点,以非父节点作为树的叶子结束。

通过添加中间 parent-pom,您可以让根父级仅提供所有子级真正使用的依赖项,而中间 pom 可以提供仅由其子级使用但不由其兄弟姐妹的子级使用的附加依赖项。

因此,在您的情况下,您的根父 pom 将声明除 cassandra 之外的所有依赖项,并且它将有两个子项:您的 cassandraless 项目和您现有的父 pom,它现在将成为中间父 pom,它只会声明卡桑德拉依赖。因此,中间父 pom 的子代会从根继承除 cassandra 之外的所有依赖项,然后从中间父 pom 继承 cassandra。

我试过了,效果很好。

确实可能存在理论上无法覆盖的情况,因为父pom只能形成树,而树不是图,但在实践中我从未遇到过我想安排我的依赖关系的情况以这种机制无法覆盖的方式。

举个例子,看看我的公共家庭项目,为了更轻松地管理它们,我将它们整合到一个存储库中:

https://github.com/mikenakis/Public

https://github.com/mikenakis/Public/blob/master/pom.xml 是根 pom。

https://github.com/mikenakis/Public/blob/master/testana/pom.xml是一个中间父pom,

https://github.com/mikenakis/Public/blob/master/testana/testana-console/pom.xml 是一个子 pom。 (一片叶子。)

现在,在我的项目中,恰好我只在叶子 pom 中声明依赖项,因为我的项目并不真正依赖于许多外部库。但如果我愿意,我可以在根 pom 和中间父 pom 中声明依赖关系,并且它们的子级将继承它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多