Maven使用但未声明依赖关系

3

我发现了Maven依赖插件提供的有趣特性。我分析了我的一个项目并得到了以下输出:

[WARNING] Used undeclared dependencies found:
[WARNING]    org.apache.geronimo.specs:geronimo-javamail_1.4_spec:jar:1.6:compil
e
[WARNING]    javax.xml.soap:saaj-api:jar:1.3:compile
[WARNING]    org.apache.geronimo.specs:geronimo-annotation_1.0_spec:jar:1.1.1:co
mpile
[WARNING]    org.apache.geronimo.specs:geronimo-jaxws_2.1_spec:jar:1.0:compile
[WARNING]    org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Fin
al:compile
[WARNING]    org.apache.geronimo.specs:geronimo-ws-metadata_2.0_spec:jar:1.1.2:c
ompile
[WARNING] Unused declared dependencies found:
[WARNING]    junit:junit:jar:4.5:test
[WARNING]    log4j:apache-log4j-extras:jar:1.1:compile
[WARNING]    org.slf4j:slf4j-log4j12:jar:1.6.4:compile
[WARNING]    org.slf4j:slf4j-api:jar:1.6.4:compile
[WARNING]    org.hibernate:hibernate-c3p0:jar:3.6.8.Final:runtime

“未使用声明”部分对我来说很清楚。关于“已使用未声明”部分,它向我展示了直接由我的项目使用,但被Maven传递地包含在类路径中的依赖项。
以第一个为例,"org.apache.geronimo.specs:geronimo-javamail_1.4_spec:jar:1.6:compile",这个依赖项是因为它是cxf-rt-core-2.2.6的一个依赖项而被包含的。但是,JAR中的代码也直接被项目使用。现在我在想,当编写此项目时,开发人员可能有意使用另一个Java Mail JAR。
如果我想在我的项目中使用CXF 2.2.6,我会自动获得Geronimo提供的Java Mail规范作为传递依赖项。如果我想使用另一个Java Mail API呢?通过查看search.maven.org,我可以看到许多JAR提供Java Mail API。
谢谢
2个回答

1

如果您想排除特定的传递依赖项,可以使用依赖项排除

<dependency>
  <groupId>...</groupId>
  <artifactId>..</artifactId>
  <version>..</version>
  <exclusions>
    <exclusion>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
    </exclusion>
    ..
  </exclusions> 
</dependency>

这只适用于可追溯依赖关系的第一级。


我知道这个解决方案是存在的。就像你说的那样,它只适用于第一级传递依赖关系。所以,如果我使用一个依赖于B的项目A,而B又依赖于geronimo-javamail-spec,那么我就被迫使用它,并且无法在我的类路径中包含另一个Java Mail API? - manash
啊,抱歉。不要直接将B添加为依赖项并排除它。因为最短路径到依赖项获胜。 - khmarbaise
谢谢。但是,一般来说,在这种情况下应该做出什么决定?使用Geronimo依赖是否足够? - manash
如果这些依赖项中有邮件,则是这些,否则您还必须更改其他依赖项。我无法给出一般性建议,您必须检查依赖项。 - khmarbaise
你确定只有第一级的限制吗?在你提供的文档页面上写着:“排除操作作用于声明它们的点以下的整个依赖关系图。如果你想要排除Project-E而不是Project-D,你只需要将排除操作指向Project-E,但你不应该将排除操作下移至Project-D...” - andresp

1

程序员可能忽略了检查Java Mail API jar的版本 - 这正是“使用未声明的依赖项”警告的原因。您应该通过将依赖项添加到主POM中作为直接依赖项来进行修复。使用当前有效的版本(因为它是传递性包含的),不必担心原始程序员的意图 - 他们可能根本没有考虑过。

然后,如果传递版本以破坏方式更改,则您的项目应该没问题,因为它已直接列出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接