Maven中未使用/未声明的依赖项是什么?他们怎么办?

b7k*_*ich 62 dependencies maven-2 maven

Maven dependency: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
Run Code Online (Sandbox Code Playgroud)

注意:我的运行时容器中使用了很多这些依赖项,并且我将它们声明为提供它们以避免在类路径上使用不同版本两次使用相同的库.

Rag*_*ram 75

不确定Maven如何判断这一点.不需要解决此报告的所有项目,但可以酌情使用此信息.

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

至于未使用的声明依赖项,最好删除它们.为什么要为项目添加不必要的依赖?但是,传递性可能会带来这些,或许与您的运行时版本冲突.在这种情况下,您需要指定它们 - 主要是为了控制它们version.

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

  • 使用`runtime`或`provided`范围的依赖关系将标记为"未使用声明",除非您在分析依赖关系时使用`ignoreNonCompile`标志. (10认同)
  • 此外,依赖关系可能看似未使用,但实际上是.这方面的一些例子是需要应用程序上下文的jdbc驱动程序或配置jar. (7认同)
  • 为什么明确声明传递依赖是一个好主意?是不是将传递依赖项自动化是Maven有用的部分? (7认同)
  • Raghuram指的是使用未申报的依赖关系.即你的项目A使用依赖库C的库B.如果你也直接使用C你不必声明它 - maven将通过传递依赖自动拉入它.但是,如果没有声明依赖关系,您就无法控制版本.例如,如果B决定更新到下一版本的C,则项目A可能会中断,除非更新向后兼容 (6认同)

ahm*_*l88 8

使用声明的依赖项
简单地说,它们是您正在使用它们没有在 POM 文件中显式声明它们的传递依赖项。

在下图中,橙色的。
在此输入图像描述

提示:
最好在 POM 文件中声明它们与第一级依赖项松散耦合,因此将来如果他们计划更改其实现并且不再使用这种传递依赖项,您的应用程序将是安全的!

使用声明的依赖项简单地说,它们是您在 POM 文件中声明的
依赖项在应用程序代码中使用它们。

在下图中,红色的。
在此输入图像描述

提示:
最好从 POM 文件中删除它们,因为它们没有被使用,并且保存应用程序工件的最终大小,也可以避免任何开发人员错误地使用错误的类!


Zwa*_*bhi 5

答案是:

"它如何确定未使用哪些以及哪些未申报?".

Maven使用Object WebASM框架来分析原始字节码.它遍历所有类,然后构建这些引用的所有类的列表.那是怎么回事.

至于做什么,我不建议删除"未使用的,声明的dependecies"除非你绝对确定他们实际上没用.