Maven 中有哪些未使用/未声明的依赖项?如何处理它们?

2022-08-31 12:09:38

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

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


答案 1

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

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

至于未使用的已声明依赖项,最好将其删除。为什么要向项目添加不必要的依赖项?但是,传递性无论如何都会带来这些,也许会与您的运行时版本冲突。在这种情况下,您需要指定它们 — 实质上是为了控制 .version

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


答案 2

答案是:

“它如何确定哪些是未使用的,哪些是未申报的?

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

至于该怎么做,我不建议删除“未使用的,声明的依赖项”,除非您绝对确定它们实际上未使用。


推荐