代码之家  ›  专栏  ›  技术社区  ›  PatPanda

Java Maven-多模块项目:从父pom中排除依赖项

  •  0
  • PatPanda  · 技术社区  · 4 年前

    我们有一个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上。上面的代码段现在处于父级。所有子项目仍然可以从中受益,只需在一个地方维护版本,大家都很高兴。

    我们现在有一个第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中排除一个特定的依赖关系?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Mike Nakis    3 年前

    我通常的做法是使用多级poms层次结构。

    这意味着,我有一棵完整的父球树,而不是一个只有一排非父球的单亲球,它由一个根父球和几个层次的中间父球组成,以非父球作为树的叶子结束。

    通过添加中间父pom,您可以让根父只提供所有子级真正使用的依赖关系,而中间pom可以提供仅由其子级使用而不由其兄弟姐妹的子级使用的额外依赖关系。

    因此,在您的情况下,您的根父pom将声明除cassandra之外的所有依赖项,并且它将有两个子项:您的casandraless项目和您现有的父pom,后者现在将成为中间父pom并且只声明cassandra依赖项。因此,中间父pom的子级将从根继承除cassandra之外的所有依赖项,然后从中间父pof继承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 是一个儿童玩具。(一片叶子。)

    现在,在我的项目中,碰巧我只在leaf-poms中声明依赖关系,因为我的项目并不真正依赖于许多外部库。但如果我愿意,我可以在根pom和中间父pom中声明依赖关系,它们的子节点将继承它们。