我即将继承具有大量第三方依赖关系的相当大的Java企业项目。至少包括七十个JAR,其中一些似乎未被使用,例如我知道spring.jar没有使用。如何在大型项目中清除依赖关系?
看来,多年来,由于各种开发人员已经涉及到代码库,他们都试用了新的月度类型库。
如何去除掉这些?当然,理所当然,一些依赖关系有助于不必重新发明轮子。
我明显对基于java的项目很感兴趣,但我很欢迎各种语言的答案,人们认为这些答案会有所帮助。
我即将继承具有大量第三方依赖关系的相当大的Java企业项目。至少包括七十个JAR,其中一些似乎未被使用,例如我知道spring.jar没有使用。如何在大型项目中清除依赖关系?
看来,多年来,由于各种开发人员已经涉及到代码库,他们都试用了新的月度类型库。
如何去除掉这些?当然,理所当然,一些依赖关系有助于不必重新发明轮子。
我明显对基于java的项目很感兴趣,但我很欢迎各种语言的答案,人们认为这些答案会有所帮助。
就我个人而言,我认为你必须从评估问题的严重程度开始。这将是相当痛苦的,但我会列出依赖关系的列表,并确定项目的哪些部分使用哪些部分。
然后,我会准确地确定每个实际使用的功能(在很多情况下,最终会有一个很大的第三方库)。
一旦你有了这些信息,你至少会知道你在处理什么。
我的下一步是查看所有只在很小范围内使用的依赖关系。检查周围可能会发现可以从其他库中使用的可以消除较少使用的库的内容。
我也想看看有没有什么小的东西可以重新编写并包含在您自己的代码库中。
最后,我会查看一下您的依赖关系及其竞争对手的供应商,看看最新版本是否包含更多功能,可以让您省略其他几个功能。
然后,你只是想知道是否高度依赖少数供应商,或更少依赖于很多供应商! ; o)
如果您有一组很好的自动化测试,并且您正在寻找删除根本不使用的库,那么您可以使用试验和错误。一次一个,删除一个库,并运行测试,看看是否一切仍然有效。如果没有,就把它放回去。当然,如果你甚至无法建立一个图书馆,你可能需要它。
基本上,不管你怎么做,我的想法是一次删除一个,看看有什么突破。如果没有什么突破,赔率是好的,你可以扔图书馆。如果问题很小(例如,您需要一个大型库中的一个类的方法),则可以对其进行编码。
如果您正在处理独立应用程序,那么可以给JVM一个-verbose:class选项以查看正在加载哪些类。这应该给你喜欢的消息:
[Opened C:\Program Files\Java\jre1.6.0_04\lib\rt.jar]
[Loaded java.util.regex.Pattern$Single from C:\Program Files\Java\jre1.6.0_04\lib\rt.jar]
我读到关于使用仪器here的做法,从来没有尝试过,但听起来很合理。
我们在delphi代码库上完成了这样的练习。我们极大地简化了我们的外部依赖关系。基本上,我们去了解它是这样的:
然而,这是相当多的工作。
structure101 http://www.headwaysoftware.com/products/structure101/index.php 这是显示依赖关系的好工具。我已经使用了几年。
如果你采取“删除东西,直到它不会编译”的方法,你需要非常小心传递运行时依赖。如果有一个高质量的测试套件,它可以提供帮助,但是您肯定需要运行一个像Cobertura这样的测试覆盖工具,以确保足够的代码已经过测试,可以锻炼完整的依赖关系图。
你在说多少代码? Joeri建议的基于评论的方法坦率地说对我来说似乎是最好的;它具有使您至少表面熟悉系统所有部分的额外优势。如果你只是继承了一个大项目,那么你应该花些时间去做。
如果您有针对此项目的完整回归测试套件,您只需运行回归套件,同时每次运行1个循环中的少量JAR。它并不快,但它很容易做到。
只要说没有全面的测试套件,就有一些测试,但没有接近完成。所以这种方法显然不会有太大的帮助。 – 2008-10-11 01:45:56