有没有一种简单的方法可以从maven pom.xml中删除未使用的依赖项?


277

我有一个大型的Maven项目,其中包含许多模块和许多pom.xml文件。该项目已更改,我怀疑pom包含一些不必要的依赖项。有没有从pom删除任何未使用的依赖项的命令?


2
如果您使用的是IntelliJ,请参见:jonnyzzz.com/blog/2013/05/13/…如果链接无效:Jonnyzzz Dependencies plugin
Benj

3
@Benj我尝试使用此jonnyzz插件,但它没有用。在大多数情况下,它将找不到任何未使用的依赖项,有时,当它找到时,它将从类路径而不是build.gradle文件中删除依赖项。我什至找不到合适的文档来解释此插件的实际工作方式。
vaibhav.g,

@ vaibhav.g感谢您的更新。自2016年以来,情况似乎发生了变化。

Answers:


222

Maven的依赖插件会有所帮助,尤其是dependency:analyze目标:

dependency:analyze分析该项目的依赖关系,并确定以下内容:使用和声明;使用和未声明的;未使用和声明。

这可能有助于做一些清理工作的另一件事情是依赖趋同报告Maven项目信息报告插件


5
如何在Eclipse中触发呢?
Daniil Shevelev 2014年

134
请谨慎依赖:分析,某些在运行时使用的库被视为未使用。
Nereis 2014年

27
为了防止报告运行时和提供的依赖项未使用,ignoreNonCompile可以将该选项设置为true。
sudeep 2015年

使用Dependency时要小心:分析,即使我使用的是“ ejp api3”依赖,但报告显示它也是“未使用和声明的”
Akhil S Kamath

要了解分析结果,请参见以下答案:“使用的未声明依赖关系是必需的,但尚未在项目中明确声明为依赖关系。” - stackoverflow.com/questions/4565740/...
Janac米娜

49

您可以使用 dependency:analyze -DignoreNonCompile

这将打印列表中使用未申报的未使用的声明依赖(而忽略runtime/ provided/ test/ system未使用的依赖性分析范围。)

使用此库时要小心,一些在使用的库runtime被视为未使用!

有关更多详细信息,请参阅此链接


4
[加] 1为运行时提!
gaurav

1
没错,某些运行时依赖项被清除为未使用,但实际上是必需的。
Smart Coder

43

正如其他人所说,您可以使用dependency:analyze目标来查找使用和声明了哪些依赖项,使用了未声明的依赖项或未使用和声明了哪些依赖项。您可能还会发现dependency:analyze-dep-mgt对于在dependencyManagement部分中查找不匹配项很有用。

您可以简单地从POM中删除不需要的直接依赖项,但是如果它们是由第三方jar引入的,则可以使用<exclusions>依赖项中的标记来排除第三方jar(有关详细信息和一些讨论,请参阅标题为Dependency Exclusions)。 。这是一个从Spring依赖项中排除commons-logging的示例:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring</artifactId>
  <version>2.5.5</version>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions> 
</dependency>

3
(IntelliJ)我使用了Jonnyzzz插件,对此问题进行了评论。不错的插件,可以与IntelliJ 2016.1.3配合使用
Benj

34

您是否看过Maven依赖插件?那不会为您删除任何东西,但是有工具可以让您自己进行分析。我特别在想

mvn dependency:tree

1
太好了-谢谢(我一直在寻找“干净的依赖项”时找不到我想要的东西,而且它抛出了干净的插件!!但这看起来很有希望

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.