Java 在类级别上分析未使用的可传递依赖项

Java 在类级别上分析未使用的可传递依赖项,java,maven,jar,Java,Maven,Jar,假设以下情况:我的Maven项目依赖于一个JARA,它依赖于10个其他jar,而这些jar又依赖于更多的其他jar。我得到一个巨大的类路径,如果我正在构建一个war/ear,我会得到一个巨大的工件 实际上,我只在jara中使用了foo类。foo类使用了其他几个类,它们包含在另外三个jar中。所以我真的只需要JARA和其他三个jar来编译,而不是全部依赖项(以及它们的依赖项等等) 有没有一种在类级别(半)自动分析依赖关系树的方法?据我所知,Maven没有这方面的内置功能 我只想说清楚:我知道这样的

假设以下情况:我的Maven项目依赖于一个JARA,它依赖于10个其他jar,而这些jar又依赖于更多的其他jar。我得到一个巨大的类路径,如果我正在构建一个war/ear,我会得到一个巨大的工件

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

有没有一种在类级别(半)自动分析依赖关系树的方法?据我所知,Maven没有这方面的内置功能

我只想说清楚:我知道这样的情况不应该发生在一个好的软件架构中。但是如果我得到一个jara,它实际上只是一个用于不同目的的类的集合,那么当我用Maven构建依赖关系树时,我可能会得到很多不必要的依赖关系。我也不能改变一个习惯

很久以前,我就开始使用Maven插件:

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

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


我从来没有时间完成它,但也许有人会感兴趣?重型提升已经完成。

您可以从maven依赖项中排除可传递工件,但只能手动。依赖关系树列出了这些。最快的方法是将它们全部排除并逐个重新引入,直到您的项目再次编译。我知道很乱。如果有人知道另一种方式:请发布:D@JFMeier和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来理解这一点。让我尝试以不同的方式来解释它:假设我构建了一个war A,它依赖于jar B,它依赖于jar C。Maven构建了图形A->B->C,并将B和C都包含在我的war中。依赖关系:analyze将发现我确实使用了工件B,因此Maven依赖关系树是正确的。实际上,我只使用了一个完全独立于C的B类。因此,如果我将C从我的war项目中排除,一切都可以正常工作,但Maven无法知道这一点,因为它只关注工件级别,而不是类级别。@lexicore有趣的是,我们同时构建了同样的例子。@JFMeier我的想法完全正确。