0

我即将继承一个具有大量第三方依赖项的相当大的 Java 企业项目。至少包含 70 个 JAR,其中一些似乎未使用,例如我知道未使用的 spring.jar。

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

如何摆脱这些?当然,在合理范围内,显然某些依赖项有助于不必重新发明轮子。

我显然对基于 Java 的项目很感兴趣,但我欢迎跨语言回答人们认为会有帮助的问题。

4

7 回答 7

4

就个人而言,我认为您必须从评估问题的规模开始。这将是相当痛苦的,但我会列出一个依赖项列表,并准确计算出项目的哪些部分使用哪些依赖项。

然后我会准确计算出您实际使用的每个功能的哪些功能(在许多情况下,您最终会拥有一个庞大的第三方库,而您只使用了其中的一小部分)。

一旦你有了这些信息,你至少会知道你在处理什么。

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

我还会四处看看,看看是否有什么小东西可以重写并包含在自己的代码库中。

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

然后你就想知道是高度依赖少数供应商更好,还是更少依赖很多供应商!;o)

于 2008-10-10T14:04:48.857 回答
2

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

于 2008-10-10T15:47:30.957 回答
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]
于 2008-10-10T14:44:22.020 回答
1

我在这里读到了一种使用仪器的方法,从未尝试过,但听起来很合理。

于 2008-10-10T14:53:31.207 回答
1

我们在 delphi 代码库上进行了这样的练习。我们极大地简化了我们的外部依赖。基本上,我们是这样处理的:

  • 对所有外部库和组件进行了编目
  • 编目(使用文件搜索工具)它们的使用地点和用途。
  • 删除了我们不使用或不需要的所有内容(一些库在不再需要的代码中使用)。
  • 根据该库是否积极开发、我们使用了多少功能、将使用它的代码移植到我们已经使用的另一个库的难度等等,对我们喜欢哪些库进行了排名。
  • 最后,我们通过将该功能移植到另一个库来迭代地删除对列表低位库的依赖。

然而,这是相当多的工作。

于 2008-10-10T14:56:21.123 回答
1

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

你在说多少代码?坦率地说,Joeri 建议的基于审查的方法对我来说似乎是最好的。它还有一个额外的好处,就是让您至少对系统的所有部分都熟悉。如果您只是继承一个大项目,那么无论如何您都应该花时间去做。

于 2008-10-10T16:07:54.800 回答
0

if you have a full regression test suite for this project, all you have to do is run the regression suite while running with 1 less JAR each time in a loop. it is NOT fast BUT it is easy to do.

于 2008-10-10T16:45:19.280 回答