【问题标题】:Analysis of unused transitive dependencies on the class level类级别未使用的传递依赖分析
【发布时间】:2017-05-02 10:14:06
【问题描述】:

假设以下情况:我的 Maven 项目依赖于一个 jar A,它依赖于其他 10 个 jar,这些 jar 传递地依赖于更多其他 jar。我得到一个巨大的类路径,如果要构建一个战争/耳朵,我得到一个巨大的工件。

实际上,我只使用了 jar A 中的类 foo。类 foo 使用了其他几个类,这些类包含在其他三个 jar 中。所以我真的只需要 jar A 和其他三个 jar 来编译,而不是一堆依赖项(以及它们的依赖项等等)。

有没有办法在类级别(半)自动分析依赖树?据我所知,Maven 对此没有内置功能。

明确一点:我知道这样的情况不应该出现在一个好的软件架构中。但是,如果我得到一个 jar A,它实际上只是用于不同目的的类的集合,那么当我使用 Maven 构建依赖关系树时,我可能会得到很多不必要的依赖关系。而改变A不是我能做的。

【问题讨论】:

  • 您可以从 maven 依赖项中排除传递工件,但只能手动排除。依赖树列出了这些。最快的方法是将它们全部排除并重新引入它们,直到您再次进行项目编译。很乱,我知道。如果有人知道不同的方式:请发布:D

标签: java maven jar


【解决方案1】:

很久以前,我为此启动了 Maven 插件:

https://github.com/highsource/storyteller-maven-plugin

How to find unneccesary dependencies in a maven multi-project?

它可以工作,但绝不会完成/记录等。我也不想以任何方式在这里“出售”它。

但你写的正是我当时的想法。 maven-storyteller-plugin 基本上分析了类的依赖关系并构建了一个巨大的图表。然后它可以判断您是否真的需要在项目中声明的依赖项。它还可以导出漂亮的依赖关系图(使用 GraphViz)。

我从来没有时间完成它,但也许有人会感兴趣?繁重的工作已经完成了。

【讨论】:

  • @JF Meier 和 lexicore - 只是为了理解,在 pom 中仅包含项目所需的依赖项(jar)并排除其余传递项的做法有什么问题?你的想法与org.apache.maven.plugins:maven-dependency-plugin:3.0.0:analyze 有何不同?
  • @nullpointer 假设你的项目 A 依赖于 B,B 依赖于 C。但是 A 不需要来自 B 的需要 C 的类。那么 A 不需要 C,它可以被排除。但是,你只能通过在类级别上分析依赖关系 A、B 和 C 来理解这一点。
  • 让我尝试以不同的方式解释它:假设我构建了一个战争 A,它依赖于 jar B,而 jar B 又依赖于 jar C。Maven 构建图 A -> B -> C 并包括B和C都进入了我的战争。 dependency:analyze 会发现我真的用了神器B,这样Maven依赖树是正确的。实际上,我只真正使用了一个完全独立于 C 的 B 类。因此,如果我将 C 从我的战争项目中排除,一切正常,但 Maven 无法知道这一点,因为它只查看工件级别,而不是类水平。
  • @lexicore 有趣的是,我们同时构建了相同类型的示例。
  • @JFMeier 我的想法完全正确。
猜你喜欢
  • 2012-10-09
  • 2019-11-04
  • 2018-07-06
  • 2018-07-13
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多