Java的类依赖工具

我知道很多相关的问题已经提出来了,但是我找不到任何完全令人满意的问题 – 可能是因为我的要求与提出的每个问题略有不同。

我有一个巨大的代码库,我想分解成更小的逻辑单元。 为此,我需要找到所有纠结/循环依赖关系并解决它们。 由于现有意大利面条的大小,唯一可行的策略似乎是分而治之,所以我需要先将大项目分成小块或剥离独立部分并分别处理较小的部分。

我能找到的大多数工具似乎只适用于类或包级别,但它们似乎不支持子包的概念。 例如,如果我有一个根软件包,下面有3个软件包,然后是3个下面的5个子软件包,那么我将获得1 + 3 + 15 = 19个软件包,这将给我一个疯狂的复杂图形。 现在,我希望能够做的是首先分析3个顶级包之间的依赖关系(传入/传出包的数量,以及哪些类发起这些依赖关系),在进入这些顶级之前清理它。级别包可以在下一级工作。

现在,我已经将Structure 101用于此目的,并且效果很好,但是当试用期满时,产品的价格对我的预算来说有点陡峭。 那里有免费/开源的解决方案吗?

提前致谢!

据我所知,没有可与工程101远程比较的免费工具。 (我不隶属!)

所以你已经有了解决方案,但是你说价格太高了。 这可能是一个谬论。

我有一个巨大的代码库,我想分解成更小的逻辑单元。

大概你不是为了好玩而做这件事,但有人付钱给你做。 结构101的900美元大约是3-4天的工作 – 假设你每月作为香港的高级软件开发商赚到40,000港币(5200美元)。 应该可以说这实际上最终会节省很多钱。

JAVADepend的试验提供了分析所需依赖关系的可能性,没有时间限制。

这是一个很好的工具。

看看CodePro Analytix 。 它有几个用于依赖性分析的工具以及你应该注意的大量其他事情。

有关离线分析,请查看SonarQube 。 它没有依赖图,但有一个模块用于您的类中的依赖循环以及大量的质量测量模块。

项目: https : //github.com/lukehutch/fast-classpath-scanner

如何使用最新的提示/新闻: https : //github.com/lukehutch/fast-classpath-scanner/releases

预编译的jar子+来源: https ://oss.sonatype.org/#nexus-search;quick~fast-classpath-scanner

例如: https : //github.com/lukehutch/fast-classpath-scanner/wiki/3.9.-Generating-a-GraphViz-dot-file-from-the-classgraph

ScanResult scanResult = new FastClasspathScanner( MyClass.class.getPackage().getName()).scan(); String str = scanResult.generateClassGraphDotFile(9.2f, 8.0f); Files.write(str, new File("GraphViz.dot"), StandardCharsets.UTF_8); System.out.println("now run this at terminal: dot -Tsvg < GraphViz.dot > GraphViz.svg"); 

你有没有看过针对eclipse的ObjectAID或PlantUML插件? 不像你要问的那样强大,但绝对可以免费提供一些好的UML建模机制。

免责声明 :我是coffea的作者

我教过我应该分享,因为我再次遇到类似的问题(即一个具有多级,复杂的包依赖性且几乎没有任何结构的巨大代码库),而且我不知道目前有任何可用的替代方案。

在我看来,在处理混乱的包结构时没有什么比脚本和/或显式分组规则更好,因为我没有找到任何合理的方法来做到这一点,我推出了自己的工具 。

当然,这不会超过任何商业替代方案,但这是一种相当简单的方法,应该允许您在没有周围噪声的情况下研究有趣的部分。

试试FastClasspathScanner: https : //github.com/fast-classpath-scanner/fast-classpath-scanner (免责声明,我是作者)

例如:

 try (PrintWriter out = new PrintWriter("/tmp/classgraph.dot")) { out.print(new FastClasspathScanner() .whitelistPackages("com.xyz") .enableAllInfo() .scan() .getAllClasses() .generateGraphVizDotFile( sizeX, sizeY, showFields, showMethods, showAnnotations )); }