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

如何关闭maven项目的可传递依赖项?,maven,maven-3,transitive-dependency,Maven,Maven 3,Transitive Dependency,我遇到了一个解决方案,它在POM的每个依赖项标记中包含排除标记 但是我有大量的项目,每个项目都有大量的依赖标签。将此包含在每个依赖项标记中是不可行的 问题:是否有一种方法可以全局关闭maven中可传递依赖项的导入?在maven中,您不能以单一方式关闭所有已声明依赖项的可传递依赖项,如 为什么排除是基于每个依赖项而不是POM级别进行的 这样做主要是为了确保依赖关系图是可预测的,并防止继承效应排除不应排除的依赖关系。如果您使用了最后一种方法,并且不得不将其排除在外,那么您应该绝对确定哪些依赖项带来了

我遇到了一个解决方案,它在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>