如何关闭maven项目的可传递依赖项?
我遇到了一个解决方案,它在POM的每个依赖项标记中包含排除标记 但是我有大量的项目,每个项目都有大量的依赖标签。将此如何关闭maven项目的可传递依赖项?,maven,maven-3,transitive-dependency,Maven,Maven 3,Transitive Dependency,我遇到了一个解决方案,它在POM的每个依赖项标记中包含排除标记 但是我有大量的项目,每个项目都有大量的依赖标签。将此包含在每个依赖项标记中是不可行的 问题:是否有一种方法可以全局关闭maven中可传递依赖项的导入?在maven中,您不能以单一方式关闭所有已声明依赖项的可传递依赖项,如 为什么排除是基于每个依赖项而不是POM级别进行的 这样做主要是为了确保依赖关系图是可预测的,并防止继承效应排除不应排除的依赖关系。如果您使用了最后一种方法,并且不得不将其排除在外,那么您应该绝对确定哪些依赖项带来了
包含在每个依赖项标记中是不可行的
问题:是否有一种方法可以全局关闭maven中可传递依赖项的导入?在maven中,您不能以单一方式关闭所有已声明依赖项的可传递依赖项,如 为什么排除是基于每个依赖项而不是POM级别进行的 这样做主要是为了确保依赖关系图是可预测的,并防止继承效应排除不应排除的依赖关系。如果您使用了最后一种方法,并且不得不将其排除在外,那么您应该绝对确定哪些依赖项带来了不需要的可传递依赖项
事实上,由于Maven,您可以指定通配符来排除特定依赖项的所有可传递依赖项,但这仍然是每个依赖项,而不是全局依赖项 在每个pom中的每个依赖项中,您实际上希望有如下内容(!!): 然后,将在指定的
dependencies.txt
文件中写入所声明的相关项目的依赖项(格式为groupId:artifactId:packaging:version:scope
)。注意:最后一个参数,appendOutput
,可能有助于在同一个文件的末尾写入,以使它们集中起来进行进一步处理(删除重复项,将它们移动到新的父pom)
要将通配符应用于所有声明的依赖项,一个快速提示是简单地(使用任何文本编辑器或通过shell脚本)替换以下标记:
</version>
</dependency>
通过以下方式:
</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
*
*
然后保存文件。自动地,您将以一种非常安全的方式将通配符排除应用于所有依赖项
UpdatebyOP:最后我们决定不这样做,而是通过使用dependency tree命令为每个项目生成新添加/删除的依赖项的报告并广播来解决原始问题 即使我不确定您为什么想要这样一种机制,我也不建议您只排除您实际上不想要的可传递依赖项,因为依赖它们的依赖项在没有它们的情况下可以运行 最后一点非常重要,您的依赖项需要这些可传递的依赖项才能正常工作
因此,尽管上面提到了所有这些,ApacheMaven还是有一个名为ApacheMaven Enforcer plugin的插件,它的一个内置规则是,但是为什么您希望所有项目的所有依赖都有这样的机制呢?在这种情况下,蚂蚁可能是更好的选择。否则脚本就可以完成这项工作,但它很容易成为ihmo的维护噩梦。出于安全原因,我们需要这样做。我们有一个人工repo,在这里我们维护所有并且只需要依赖项。我们不希望不必要的依赖关系潜入包中。我想知道你提到的ant脚本会做什么。你能解释一下解决办法吗。这与POMs上的文本替换相同吗?但是,将Artifactory切换到脱机状态以完全管理其内容不是更容易吗?我指的是ant,因为您使用物理文件作为依赖项,而不是声明和可传递管理,所以您可以完全控制所使用的内容。我想到的脚本可能与下面解释的解决方案完全相同。关闭Artifactory也会限制使用新的所需依赖项。其想法是限制maven引入可传递的依赖项,并让开发人员在真正需要时手动包含依赖项。您可以在Artifactory中创建一个新的虚拟repo,其中只包含您批准的依赖项。常规开发可以将主repo用于所有内容,当您运行受限构建时,只使用受限repo以确保不包含未经批准的依赖项。非常感谢。它们从用户定义的项目视图中说明了更多内容。但我更关心的是maven从其中央存储库中提取的工件。我最终也想到了这种方法。。我猜我得跟这个一起去。。
<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>
mvn dependency:list -DexcludeTransitive=true -DoutputFile=dependencies.txt -DappendOutput=true
</version>
</dependency>
</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>