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

Posted

技术标签:

【中文标题】Maven 中未使用/未声明的依赖项是啥?拿他们怎么办?【英文标题】:What are unused/undeclared dependencies in Maven? What to do with them?Maven 中未使用/未声明的依赖项是什么?拿他们怎么办? 【发布时间】:2011-06-01 17:34:42 【问题描述】:

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

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

【问题讨论】:

相关问题:***.com/questions/19382814. 【参考方案1】:

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

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

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

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

【讨论】:

此外,依赖项可能看起来未使用,但实际上是。这方面的一些示例是需要应用程序上下文的 jdbc 驱动程序或配置 jar。 具有runtimeprovided 范围的依赖项将标记为“未使用声明”,除非您在分析依赖项时使用ignoreNonCompile 标志。 为什么显式声明传递依赖是个好主意?自动化传递依赖不是 Maven 的优点吗? Raghuram 指的是使用的未声明的依赖项。 IE。您的项目 A 使用依赖于库 C 的库 B。如果您也直接使用 C 您不必声明它 - maven 将通过传递依赖自动将其拉入。但是如果不声明依赖项,您就无法控制版本。例如。如果 B 决定更新到 C 的下一个版本,除非更新向后兼容,否则您的项目 A 可能会中断【参考方案2】:

答案:

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

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

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

【讨论】:

【参考方案3】:

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

在下图中,橙色的那个。

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

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

在下图中,红色的那个。

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

【讨论】:

【参考方案4】:

这可以通过在 pom.xml 中添加 ignoredUnusedDeclaredDependencies 来轻松解决

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <ignoredUnusedDeclaredDependencies>
                    <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
                </ignoredUnusedDeclaredDependencies>
            </configuration>
        </execution>
    </executions>
 </plugin>

【讨论】:

以上是关于Maven 中未使用/未声明的依赖项是啥?拿他们怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

定位经度和纬度的 gradle 编译依赖项是啥?

maven依赖信息获取

抑制 Maven 依赖插件的“发现未使用的声明依赖项”警告

Twilio 的 SMS 验证 gradle 依赖项是啥?

Maven:我应该保留还是删除声明的依赖关系,它们也是传递依赖关系?

android.media.tv 的依赖项是啥