gpt4 book ai didi

maven - 如何关闭 Maven 项目的传递依赖项?

转载 作者:行者123 更新时间:2023-12-04 12:29:46 25 4
gpt4 key购买 nike

我遇到过JIRA post这给出了一个解决方案,即在 POM 的每个依赖项标记中包含排除标记。

但是我有大量的项目,每个项目都有大量的依赖标签。包含此内容是不可行的 <exclusion>在每个依赖标签中。

问题 : 有没有办法在 maven 中全局关闭传递依赖项的导入?

最佳答案

正如 official documentation 所述,在 Maven 中,您无法以单一方式关闭所有已声明依赖项的传递依赖项。

Why exclusions are made on a per-dependency basis, rather than at the POM level

This is mainly done to be sure the dependency graph is predictable, and to keep inheritance effects from excluding a dependency that should not be excluded. If you get to the method of last resort and have to put in an exclusion, you should be absolutely certain which of your dependencies is bringing in that unwanted transitive dependency.



事实上,由于 Maven 3.2.1您可以指定通配符以排除特定依赖项的所有传递依赖项,但这仍然是每个依赖项而不是全局依赖项。

您实际上希望每个 pom 中的每个依赖项都具有以下内容(!!):
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>

虽然这不是可取的,因为它可能很容易(和负面)影响相关项目的可维护性,但一个可能的解决方案是拥有一个通用的 parent POM对于所有相关项目,以便每个 pom 声明:
<parent>
<groupId>com.sample</groupId>
<artifactId>projects-governance</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

然后,在相关的父 POM 中,您将拥有:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<dependencyManagement>
<dependencies>
<!-- for each and every foreseen dependency of children poms -->
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId</artifactId>
<version>version</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
</project>

请注意 dependencyManagement 部分,在这里我们要说的是:对于所有子 POM,每当您使用我声明的相关依赖项时,对于这个 groupId 和这个 artifacId,默认情况下这个版本和这个排除将被应用。

这个解决方案的主要优点是你集中了这个机制/管理,这样至少你不必接触每个 POM(除了关于新父级的更改)。

但是,您仍然需要在父 POM 中列出所有项目使用的所有依赖项,并为所有项目应用通配符排除项。

要获取每个项目的所有依赖项的列表,您可以采用手动方法(打开每个 POM!)或在每个项目上运行以下命令:
mvn dependency:list -DexcludeTransitive=true -DoutputFile=dependencies.txt -DappendOutput=true

Maven Dependency Plugin然后将写入指定的 dependencies.txt将相关项目的声明依赖项(格式为 groupId:artifactId:packaging:version:scope)归档。注意最后一个参数, appendOutput , 可能有助于在同一文件的末尾写入,以便将它们集中起来以供进一步处理(删除重复项,将它们移动到新的父 pom)。

要将通配符应用于所有声明的依赖项,快速提示是简单地替换(使用任何文本编辑器或通过 shell 脚本)以下标记:
    </version>
</dependency>

通过以下几个:
    </version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>

然后保存文件。并且您会自动以一种非常安全的方式将通配符排除应用于所有依赖项。

OP更新:最后我们决定不这样做,而是通过使用依赖树命令为每个项目生成新添加/删除依赖项的报告并广播它来解决原始问题。

关于maven - 如何关闭 Maven 项目的传递依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35929936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com