我知道很多关于SO的问题,但我找不到任何完全令人满意的问题 - 可能是因为我的要求与提出的每个问题略有不同。
我有一个巨大的代码库,我想分解成更小的逻辑单元。为此,我需要找到所有纠结/循环依赖关系并解决它们。由于现有意大利面条的大小,唯一可行的策略似乎是分而治之,所以我需要先将大项目分成小块或剥离独立部分并分别处理小块。
我能找到的大多数工具似乎只适用于类或包级别,但它们似乎不支持子包的概念。例如,如果我有一个root包,下面有3个包,然后是3个下面的5个子包,那么我将得到1 + 3 + 15 = 19个包,这将给我一个疯狂复杂的图。现在,我希望能够做的是首先分析3个顶级包之间的依赖关系(传入/传出包的数量,以及哪些类发起这些依赖关系),在进入这些顶级之前清理它。级别包可以在下一级工作。
现在,我已经将Structure 101用于此目的,并且效果很好,但是当试用期满时,产品的价格对我的预算来说有点陡峭。那里有免费/开源的解决方案吗?
提前致谢!
答案 0 :(得分:5)
据我所知,没有可与structure 101远程比较的免费工具。 (我不是附属的!)
所以你已经有了一个解决方案,但是你说定价太高了。这可能是一种谬论。
我有一个巨大的代码库,我想分解成更小的逻辑单元。
据推测,你不是为了好玩而做这件事,但有人付钱给你做。结构101的900美元是大约3-4天的工作 - 假设你每月作为香港的高级软件开发商赚到40,000港币(5200美元)。应该可以说这最终会节省很多钱。
答案 1 :(得分:2)
JAVADepend的试用版提供了分析所需依赖关系的可能性,而不受时间限制。
这是一个很好的工具。
答案 2 :(得分:1)
看看CodePro Analytix。它有dependency analysis的几个工具以及你应该注意的其他很多东西。
要进行离线分析,请查看SonarQube。它没有依赖图,但有一个模块用于您的类中的依赖循环以及大量的质量测量模块。
答案 3 :(得分:1)
项目: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
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");
答案 4 :(得分:0)
您是否查看了针对eclipse的ObjectAID或PlantUML插件?不像你要问的那样强大,但绝对可以免费提供一些优秀的UML建模机制。
答案 5 :(得分:0)
免责声明:我是coffea
的作者我教过我应该分享,因为我再次遇到类似的问题(即一个具有多级,复杂的包依赖性且几乎没有任何结构的巨大代码库),而且我不知道任何目前可用的免费替代品。
在我看来,在处理混乱的包结构时没有什么比脚本和/或显式分组规则更好,因为我没有找到任何合理的方法来做到这一点,所以我推出了自己的{{3} }。
当然,这不会超过任何商业选择,但它是一种相当简单的方法,应该让你能够在没有周围噪音的情况下研究有趣的部分。
答案 6 :(得分:0)
尝试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
));
}