Maven中有哪些未使用/未声明的依赖项?该怎么办?


68

Mavendependency:analyze抱怨我的项目中的依赖项。如何确定未使用的和未声明的?我该怎么办?

例:

$ mvn dependency:analyze 
...
[WARNING] Used undeclared dependencies found:
[WARNING]    org.slf4j:slf4j-api:jar:1.5.0:provided
[WARNING]    commons-logging:commons-logging:jar:1.1.1:compile
[WARNING]    commons-dbutils:commons-dbutils:jar:1.1-osgi:provided
[WARNING]    org.codehaus.jackson:jackson-core-asl:jar:1.6.1:compile

...
[WARNING] Unused declared dependencies found:
[WARNING]    commons-cli:commons-cli:jar:1.0:compile
[WARNING]    org.mortbay.jetty:servlet-api:jar:2.5-20081211:test
[WARNING]    org.apache.httpcomponents:httpclient:jar:4.0-alpha4:compile
[WARNING]    commons-collections:commons-collections:jar:3.2:provided
[WARNING]    javax.mail:mail:jar:1.4:provided

注意:在我的运行时容器中使用了许多此类依赖项,我声明了它们的提供,以避免在类路径上两次使用相同版本的同一个库。


Answers:


84

不确定Maven如何确定这一点。不需要解决由此报告的所有项目,但是可以适当地使用此信息。

使用的未声明的依赖关系是必需的,但尚未在项目中明确声明为依赖关系。但是,由于项目中其他依赖项的传递依赖关系,它们可用。显式声明这些依赖关系是一个好主意。这还允许您控制这些依赖项的版本(也许与运行时提供的版本匹配)。

对于未声明的依赖项,最好删除它们。为什么要在项目中添加不必要的依赖关系?但是,传递性无论如何都可能带来这些问题,也许与您的运行时版本冲突。在这种情况下,您需要指定它们-本质上是控制version

顺便说一句,mvn dependency:tree给出了项目的依赖关系树,这使您可以更好地了解每个依赖关系如何适合您的项目。


8
同样,依赖关系可能看起来没有使用,但实际上是。其中一些示例是需要应用程序上下文的jdbc驱动程序或配置jar。
AHungerArtist

13
具有runtimeprovided作用域的依赖项将标记为“未使用的声明的”,除非您ignoreNonCompile在分析依赖项时使用该标志。
Duncan Jones

8
为什么显式声明传递依赖关系是一个好主意?Maven的优点不是自动化传递依赖项吗?
苗条

8
Raghuram指的是使用过的未声明的依赖项。也就是说,您的项目A使用依赖于库C的库B。如果您还直接使用C,则不必声明它-maven将通过传递依赖项自动将其拉入。但是,如果不声明依赖关系,您将无法控制版本。例如,如果B决定更新到C的下一个版本,则除非更新向后兼容,否则您的项目A可能会中断
b7kich 2016年

8

答案为:

“它如何确定哪些未使用和哪些未声明?”。

Maven使用对象WebASM框架来分析您的原始字节码。它遍历您所有的类,然后构建这些引用的所有类的列表。就是这样。

至于该怎么做,除非您完全确定它们确实未使用,否则我不建议您删除“未使用的,已声明的依赖项”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.