这个问题是Java依赖关系不是静态的,而是动态的。我读过这个stackoverflow link ,但这是关于静态依赖关系,谷歌搜索得到了类似的结果。
这是我的问题:
这是一个非常大的项目(20K+ Java 文件),已经运行了 10 年,目前有 50 多名开发人员。这里的重新架构一直在发生,所以你有一个新的堆栈和一个旧的层堆栈。大多数情况下,降低风险意味着您无法立即删除某个类,而是 calle 方法同时保留对新类和旧类的调用。对开发人员的标准指示是:在生产环境中执行应用程序期间不应调用旧类。
当前解决方法:
他们所做的就是在旧类上保留一个“假旗”,并祈祷它不会被调用。如果确实如此(因为开发人员可能会错过指向新类)并且生产中出现问题,那么将针对旧类的标志设置为 true,那么世界上一切都会好起来。 (这样他们只需更改具有该标志的属性文件,而不必重新编译)在产品中进行一年左右的此类测试后,他们放弃了旧的类文件。现在这可能不是技术上最好的方法,但在实践中,对于任务关键型应用程序,您不会冒险,没有人能够记住/知道这 20K 类在 Java 中做什么,甚至在功能上。
我在寻找什么:
查找未使用的类的工具或方法。
现在,这在某些方面是一个先有鸡还是先有蛋的问题,因为直到您执行某种罕见的场景之前,您将无法找出在运行时调用的是哪个旧类,因此也无法找出现有的解决方案。
如果您使用 PMD 等静态代码分析工具,它们不会告诉您未使用的工具,因为它们实际上至少在代码级别被某些或其他类调用。
<也许,这只是疯狂的想法,某种工具可以从顶级操作层开始遍历所有依赖链/树,并获取结果
当然,响应式(Reactive)方法是构建一个完全自动化的回归测试套件并运行所有可能的场景,不幸的是,由于预算、人力限制等原因,这是不可能的。
我需要的是一种积极主动的方式来优化我的代码。也许这是一厢情愿的想法,这甚至是可能的,但我有一种挥之不去的感觉,这个问题不是随机的,而是结构化的,所以可能在某个地方有解决方案。
任何想法表示赞赏。 !!
最佳答案
由于动态类加载和反射,可能无法找到正确的解决方案。你可以从 JBoss Tattletale 开始。它可能也可以作为声纳插件使用。它可以向您显示未使用的 jar ,但它只进行静态代码分析,因此您会得到一些错误的错误。但是当您浏览列表时,您可以忽略诸如 spring-security 等内容。但是当您找到自己的 jar 时,您很可能会知道该模块中是否没有动态类加载或反射
关于java - 删除java项目中不必要的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10880726/