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。

谢谢

4

2 回答 2

1

如果你想排除一个特定的传递依赖,你可以使用excludes for dependencies

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

这仅适用于第一级传递依赖。

于 2012-05-04T08:28:32.737 回答
1

程序员很可能根本没有检查 Java Mail API jar 的版本——这正是“使用未声明的依赖项”警告的原因。您应该通过在主 POM 中添加依赖项作为直接依赖项来修复。使用当前可用的版本(因为它被传递地包含在内)并且不要担心原始程序员的意图 - 他们可能根本没有考虑过。

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

于 2012-05-04T11:49:37.623 回答