当前位置: 首页 > 知识库问答 >
问题:

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

怀宇
2023-03-14

我们有一个Maven多模块项目,其中有大约30个子项目/模块。

使用这两个依赖项的所有子项目。(这只是为了在示例中放一些具体的东西)

xml prettyprint-override"><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)。如何告诉此子项目从父项目中排除此依赖项?

> < li>

我不想完全提取此项目并将其从多模块中分离出来。

我尝试在所有依赖项中放置排除项,但它仍然存在。就像我的孩子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中排除一个特定的依赖关系?

共有1个答案

裴彦
2023-03-14

我通常的做法是使用多层次的POM。

这意味着,不是一个下面只有一排非父球的单个父球,而是一整棵父球,由一个根父球组成,它有几个级别的中间父球作为它的子球,以非父球作为树的叶子结束。

通过添加中间父POM,您可以让根父只提供所有子POM真正使用的依赖关系,而中间POM可以提供附加的依赖关系,这些依赖关系只由它们的子POM使用,而不由它们的兄弟POM的子POM使用。

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

我试过这个,效果很好。

诚然,理论上可能存在无法覆盖的情况,因为父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 是中间母体,

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

现在,在我的项目中,碰巧我只在叶pom中声明依赖关系,因为我的项目并不真正依赖于许多外部库。但是我可以在根pom和中间父pom中声明依赖关系,如果我愿意的话,他们的孩子会继承他们。

 类似资料:
  • Maven插件及其在父pom中定义的依赖项,我不希望我的子pom包含该插件依赖项。 例如,如果有1个父级和100个子级,99个使用该插件并希望在一个子级中排除该插件。 我们如何才能实现这一目标?

  • 在我的父pom xml文件中,我声明了一些在大多数孩子的pom中使用的依赖项。 然而,在一个子pom中,我不使用这些依赖项,我想找到一种方法来排除它们(为了不被视为未使用的依赖项)。 现在,在子pom的依赖部分,我什么都没有!有什么想法吗?

  • 我有一个带有子pom B、C和D的父pom A,在B、C和D中,我有相同类型的依赖项。 ie父Pom 儿童Pom 到目前为止,我已经尝试过编辑插件surefire,当试图排除子pom的测试范围时,它不起作用。 我的问题是,是否有一种方法可以将概要文件添加到父pom中,以排除所有子pom的类型测试jar的所有依赖项。谢谢

  • 我正在使用STS 2.9.1(构建在Eclipse 3.7.2上)和与STS(V1.0.200.20111228-1245)绑定的m2e插件。 我有一个问题是包含多个模块的Eclipse项目中缺少依赖项,或者我不完全理解它应该如何工作。 这是一个maven项目。 在我的项目>Properties>Java Build Path>Libraries中,我有“maven dependencies”库,

  • 我有一个关于Maven依赖解析机制如何在多模块项目中工作的问题。 通常,我只在构建多模块项目时使用“mvn clean install”,我的假设是,如果项目中的任何模块需要以前的模块,依赖关系将通过访问本地存储库并加载相应的“jar”来解决。 由于项目内部原因,我必须使用“mvn清洁编译”,这个命令自然不会创建任何“jar”,而“install”不存在。所以在这里我开始想知道,多模块项目的依赖项

  • 我有一个多模块maven项目,包含三个模块、和 Core具有以下依赖项定义 我已经为所有三个模块添加了Java9定义,的如下所示: 但是,我不知道如何让的测试类能够在测试执行期间看到类。当尝试测试运行时,找不到类。 如果向的添加需要My.Project.TestUtils;的: 然后在编译时,我得到一个错误,即找不到模块(大概是因为它只是作为测试依赖项引入的)。 在Java9模块化的世界中,如何处