Java 重复以传递方式使用的依赖项?

Java 重复以传递方式使用的依赖项?,java,maven,dependencies,dependency-management,Java,Maven,Dependencies,Dependency Management,我有一个项目X,它取决于项目Y和Z 项目Y也依赖于项目Z 如果我在我的pom.xml中只指定X依赖于Y,那么一切仍然有效,因为依赖关系Z是通过传递获得的 那么,在我的pom.xml中包含依赖项Z有什么好的理由吗?还是干脆不说就好了?这要看情况而定。如果您的项目实际上只使用来自Y的类,那么没有理由明确声明对Z的依赖关系,因为依赖于Z的是Y 但是我看到一些项目实际上使用了Y和Z中的一些类,但只声明它们依赖于Y。我认为这是一个糟糕的做法,因为:a)你没有明确声明所有的项目依赖关系;b) 如果将Y更新到

我有一个项目
X
,它取决于项目
Y
Z

项目Y也依赖于项目Z

如果我在我的
pom.xml
中只指定
X
依赖于
Y
,那么一切仍然有效,因为依赖关系
Z
是通过传递获得的


那么,在我的
pom.xml
中包含依赖项
Z
有什么好的理由吗?还是干脆不说就好了?

这要看情况而定。如果您的项目实际上只使用来自
Y
的类,那么没有理由明确声明对
Z
的依赖关系,因为依赖于
Z
的是
Y


但是我看到一些项目实际上使用了
Y
Z
中的一些类,但只声明它们依赖于
Y
。我认为这是一个糟糕的做法,因为:a)你没有明确声明所有的项目依赖关系;b) 如果将
Y
更新到较新版本,则可能会遇到问题,因为它可能不再依赖
Z
,或者依赖于可能不包含项目所需类的较新版本。

这取决于。如果您的项目实际上只使用来自
Y
的类,那么没有理由明确声明对
Z
的依赖关系,因为依赖于
Z
的是
Y


但是我看到一些项目实际上使用了
Y
Z
中的一些类,但只声明它们依赖于
Y
。我认为这是一个糟糕的做法,因为:a)你没有明确声明所有的项目依赖关系;b) 如果您将
Y
更新为较新版本,您可能会遇到问题,因为它可能不再依赖
Z
,或者依赖于可能不包含项目所需类的较新版本。

我同意Andrew的回答,但我想补充几点:

  • 你可能想看看这个。如果在X的代码中使用Z,显式地将Z作为依赖项添加到X可能会导致一些问题。例如,如果您将Z添加为测试依赖项(因为您仅将其用于测试),Z将不会包含在主类路径中,并且您将遇到一些问题,因为Y使用的类将不存在

  • Maven enforcer插件中添加了一个新的enforcer规则。它允许您更好地控制可传递的依赖项。启用时,所有可传递依赖项都将被禁止,您必须显式地包含或排除它们。有关更多详细信息,请参阅


    • 我同意安德鲁的回答,但我想补充几点:

      • 你可能想看看这个。如果在X的代码中使用Z,显式地将Z作为依赖项添加到X可能会导致一些问题。例如,如果您将Z添加为测试依赖项(因为您仅将其用于测试),Z将不会包含在主类路径中,并且您将遇到一些问题,因为Y使用的类将不存在

      • Maven enforcer插件中添加了一个新的enforcer规则。它允许您更好地控制可传递的依赖项。启用时,所有可传递依赖项都将被禁止,您必须显式地包含或排除它们。有关更多详细信息,请参阅