如何清除大型项目中的依赖项?

时间:2008-10-10 13:56:48

标签: java dependencies project

我即将继承一个拥有大量第三方依赖关系的大型Java企业项目。至少包含七十个JAR,其中一些似乎未被使用,例如我知道没有使用spring.jar。

多年来,随着各种开发人员触及代码库,他们似乎都尝试了新的月度类型库。

如何摆脱这些?当然,理所当然,一些依赖关系有助于不必重新发明轮子。

我显然对基于java的项目感兴趣,但我很乐意为人们认为有用的语言提供答案。

7 个答案:

答案 0 :(得分:4)

就个人而言,我认为你必须首先评估问题的严重程度。这将是相当痛苦的,但我会列出一个依赖项列表,并确切地确定项目的哪些部分使用哪些。

然后我会确切地确定你实际使用的每个功能(在很多情况下,你最终会拥有一个庞大的第三方库,而你正在使用它的一小部分)。

获得此信息后,您至少会知道自己在处理什么。

我的下一步是查看您在很小程度上仅使用的所有依赖项。检查周围可能会发现可以从其他库中使用的东西,这些库可以消除较少使用的库。

我还要看看是否有任何小的内容可以重新编写并包含在您自己的代码库中。

最后,我将了解您的依赖项供应商及其竞争对手,看看最新版本是否包含更多功能,以便您可以消除其他一些功能。

然后,您只是想知道是否更好地依赖于少数供应商,或者更少依赖于许多供应商! ; O)

答案 1 :(得分:2)

structure101 http://www.headwaysoftware.com/products/structure101/index.php 它是显示依赖关系的绝佳工具。我已经使用它几年了。

答案 2 :(得分:1)

如果你有一套很好的自动化测试,并且你想要删除根本没有使用的库,你可以使用试验和错误。一次一个,删除一个库,并运行您的测试,看看是否仍然有效。如果没有,请把它放回去。当然,如果你甚至不能在没有图书馆的情况下建造,你可能需要它。

基本上,无论你怎么做,我的想法是一次删除一个,看看有什么破坏。如果没有什么打破,可能只是折腾图书馆。如果问题非常小(例如,您需要在大型库中使用一个类的一个方法),那么您可以围绕它进行编码。

如果您正在处理独立应用程序,则可以为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]

答案 3 :(得分:1)

我读过使用检测here的方法,从未尝试过,但听起来很合理。

答案 4 :(得分:1)

我们在delphi代码库上经历了这样的练习。我们大大简化了外部依赖性。基本上,我们这样做了:

  • 编目所有外部库和组件
  • 编目(使用文件搜索工具)使用它们的位置以及。
  • 的用途
  • 删除了我们没有使用或不需要的所有内容(在不再需要的代码中使用了一些库)。
  • 对我们所青睐的库进行排名,根据库是否积极开发,我们使用了多少功能,将使用它的代码移植到我们已经使用过的另一个库是多么困难,等等。
  • 最后,我们通过将该功能移植到另一个库来迭代删除列表中较低库的依赖项。
然而,这是相当多的工作。

答案 5 :(得分:1)

如果你采用“删除东西直到它不会编译”的方法,你需要非常小心传递运行时依赖性。如果有一个高质量的测试套件,它可以提供帮助,但你肯定需要运行像Cobertura这样的测试覆盖工具,以确保测试足够的代码来运行你的完整依赖图。

你在谈论多少代码? Joeri坦率地提出的基于评论的方法对我来说似乎是最好的;它具有额外的优势,使您至少表面熟悉系统的所有部分。如果您只是继承一个大项目,那么您应该花些时间去做这件事。

答案 6 :(得分:0)

如果你有这个项目的完整回归测试套件,你所要做的就是运行回归套件,同时每次循环运行时少用1个JAR。它不是很快但是很容易做到。