如何清除大型项目中的依赖项?
Posted
技术标签:
【中文标题】如何清除大型项目中的依赖项?【英文标题】:How does one weed out dependencies in a large project? 【发布时间】:2010-09-16 12:34:57 【问题描述】:我即将继承一个具有大量第三方依赖项的相当大的 Java 企业项目。至少包含 70 个 JAR,其中一些似乎未使用,例如spring.jar 我知道没有使用。
多年来,随着各种开发人员接触到代码库,他们似乎都尝试了新的每月项目类型库。
如何摆脱这些?当然是合理的,因为显然某些依赖项有助于不必重新发明***。
我显然对基于 Java 的项目很感兴趣,但我欢迎跨语言回答人们认为会有帮助的问题。
【问题讨论】:
【参考方案1】:就个人而言,我认为您必须从评估问题的规模开始。这将是相当痛苦的,但我会列出一个依赖项列表,并准确计算出项目的哪些部分使用了哪些。
然后我会准确计算出您实际使用的每个功能的哪些功能(在许多情况下,您最终会拥有一个庞大的第三方库,而您只使用了其中的一小部分)。
一旦你掌握了这些信息,你至少会知道你在处理什么。
我的下一步是查看您仅在很小范围内使用的所有依赖项。检查可能会发现您可以从其他库中使用的东西,从而消除较少使用的库。
我还想看看有没有什么小东西可以重写并包含在自己的代码库中。
最后,我会看看你的依赖项的供应商和他们的竞争对手,看看最新版本是否包含更多功能,可以让你消除一些其他的。
那么你只是想知道是高度依赖少数供应商更好,还是更少依赖很多供应商! ;o)
【讨论】:
【参考方案2】:结构101 http://www.headwaysoftware.com/products/structure101/index.php 它是显示依赖关系的好工具。我已经用了几年了。
【讨论】:
【参考方案3】:如果您有一套很好的自动化测试,并且您希望删除根本不使用的库,您可以使用试错法。一次一个,删除一个库,然后运行您的测试,看看一切是否仍然有效。如果没有,请将其放回原处。当然,如果您甚至无法在没有库的情况下进行构建,那么您可能需要它。
基本上,不管你怎么做,我的想法是一次删除一个,看看有什么问题。如果没有任何问题,很有可能你可以扔掉图书馆。如果问题非常小(例如,您需要大型库中某个类的一种方法),您可以围绕它编写代码。
如果您正在处理一个独立的应用程序,您可以为 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]
【讨论】:
【参考方案4】:我读到了一种使用仪器的方法here,从未尝试过,但听起来很合理。
【讨论】:
【参考方案5】:我们在 delphi 代码库上进行了这样的练习。我们极大地简化了我们的外部依赖。基本上,我们是这样处理的:
对所有外部库和组件进行了编目 编目(使用文件搜索工具)它们的使用地点和用途。 删除了我们不使用或不需要的所有内容(某些库在不再需要的代码中使用)。 根据该库是否积极开发、我们使用它提供了多少功能、将使用它的代码移植到我们已经使用的另一个库的难度以及以此类推。 最后,我们通过将功能移植到另一个库来迭代地移除对列表低位库的依赖。然而,这是相当多的工作。
【讨论】:
【参考方案6】:如果您采用“删除东西直到它无法编译”的方法,您需要非常小心传递运行时依赖项。如果有一个高质量的测试套件,它会有所帮助,但您肯定需要运行像 Cobertura 这样的测试覆盖率工具,以确保有足够的代码得到测试,以运行您的完整依赖关系图。
你在说多少代码?坦率地说,Joeri 建议的基于审查的方法对我来说似乎是最好的。它还有一个额外的好处,就是让您至少对系统的所有部分都熟悉。如果您只是继承一个大项目,那么无论如何您都应该花时间去做。
【讨论】:
【参考方案7】:如果您对此项目有完整的回归测试套件,您所要做的就是运行回归套件,同时在循环中每次运行少 1 个 JAR。它并不快,但很容易做到。
【讨论】:
可以说没有全面的测试套件,有一些测试但几乎没有完成。所以这种方法显然不会有太大帮助。以上是关于如何清除大型项目中的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章