我发现了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
“未使用的声明”部分对我来说很清楚。关于“used undeclared”部分,它向我展示了我的项目直接使用但由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。
由于
答案 0 :(得分:1)
如果要排除特定的传递依赖关系,可以使用exclusions for dependencies。
<dependency>
<groupId>...</groupId>
<artifactId>..</artifactId>
<version>..</version>
<exclusions>
<exclusion>
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
..
</exclusions>
</dependency>
这仅适用于第一级传递依赖项。
答案 1 :(得分:1)
程序员可能根本没有检查Java Mail API jar的版本 - 这正是'Used undeclared dependencies'警告的原因。您应该通过在主POM中添加依赖项作为直接依赖项来修复。使用当前可用的版本(因为它包含了传递性)并且不用担心原始程序员的意图 - 他们可能根本没有想到它。
然后,如果传递版本以突破方式更改,则您的项目应该没问题,因为它已直接列出。