如果 pom 也以可传递方式包含,是否应该声明直接依赖项?



我的模块 MyLibrary 依赖于工件 第三方库。

我的模块 MyApplication 依赖于 MyLibrary,但也直接调用第三方库中的代码。

MyApplication 应该明确包含第三方库作为依赖项包含在 pom 中,还是依赖于 MyLibrary 将其作为依赖项包含的事实?

您应该声明应用程序直接依赖的每个依赖项,即使(目前(另一个直接依赖项以可传递方式向应用程序公开相同的依赖项。原因如下:如果您升级MyApplication以使用(您不知道的(不再依赖于ThirdPartyLibrary的未来版本MyLibrary,您的代码将突然无法编译 - 直到您将对ThirdPartyLibrary的显式依赖添加到MyApplication。这意味着这种依赖关系应该一直存在。

仅供参考,maven-dependency-plugin有一个非常有用的dependency:analyze目标,它可以帮助您弄清楚应用程序应该声明哪些依赖项;它将查看MyApplication的代码,查看对MyLibrary的依赖关系,并发出警告,指出使用了MyLibrary,但未声明:

[WARNING] Used undeclared dependencies found:
[WARNING]    org.example:ThirdPartyLibrary:jar:1.0:compile

我会减轻Andreas Sewe的回答,并说这不是绝对的规则。 如果你使用一个流行的框架,比如说Spring,你的应用程序需要Web组件,我总是告诉我的同事使用maven的传递依赖管理,并指定最高级别的要求,在这种情况下,这是在spring-web上添加依赖。 我知道到目前为止,我没有反驳安德烈亚斯的答复。

但是,如果我有一些代码或以后,我会添加一些依赖于 spring-core、spring-aop、spring-beans、spring-osm 或 spring-context(它们都是来自 spring-web 的传递依赖项(的代码,我不建议添加对其中任何一个的声明依赖项,因为这会增加属于同一框架的依赖项的 POM 文件的大小。

如果在spring-web的未来版本中删除了依赖项,那么是的,作为升级活动的一部分,您应该添加已删除的依赖项(假设您需要它(。 我的2美分。

最新更新