如何找到在Java项目中未使用的/死代码如何找到在Java项目中未使用的/死代码(How to fi

2019-05-08 15:01发布

你用什么工具来寻找大型Java项目未使用/死代码? 我们的产品已经发展了几年,而且越来越很难手动检测代码,不再使用。 然而,我们也尝试删除尽可能多的未使用的代码越好。

对于一般的策略建议/技术(不是具体的工具等)也很受青睐。

编辑:请注意,我们已经使用代码覆盖工具(四叶草的IntelliJ),但这些都是帮助不大。 死代码仍然有单元测试,并显示为覆盖。 我猜的理想工具,将识别代码的大类群,很少有其他的代码依赖于它,允许docues人工检查。

Answer 1:

我将仪器的运行系统,以保持代码的使用日志,然后开始检查未使用几个月或几年的代码。

例如,如果你有兴趣在未使用的类,所有的类可以被仪器创建实例时登录。 再小的脚本,就可以比较这些日志对类的完整列表,找到未使用的类。

当然,如果你走在方法层面,你应该保持性能的初衷。 例如,该方法只能记录他们的第一次使用。 我不知道这是如何最好用Java来完成。 我们已经在Smalltalk,这是一种动态语言这样做,因此允许修改代码在运行时。 我们的仪器有一个通话记录所有方法和卸载日志代码的方法已经被记录的第一次后,会出现一段时间没有更多的性能损失之后。因此。 也许类似的事情可以用Java做静态布尔标志...



Answer 2:

那效果相当好一个Eclipse插件是无用的代码检测 。

它处理整个项目或一个特定的文件,并显示各种闲置/死代码的方法,以及提示知名度的变化(即可以被保护的或私有的公共方法)。



Answer 3:

的CodePro最近被谷歌发布了Eclipse项目。 它是免费的,高效的。 该插件有一个“ 查找死代码与一个/多个入口点(S)”功能。 工作得很好。



Answer 4:

我惊喜的ProGuard的尚未略。 这是各地最成熟的产品之一。

ProGuard的是一个免费的Java类文件收缩机,优化,混淆和预校验。 它可以检测并删除未使用的类,字段,方法和属性。 它优化字节码和删除未使用的指令。 它重命名使用短无意义的名称,其余类,字段和方法。 最后,预校验的Java 6或为Java Micro Edition的处理的码。

ProGuard的一些用途是:

  • 创建更紧凑的代码,对于较小的代码档案,通过网络更快的传输,加载速度更快和更小的内存占用。
  • 制作程序和库更难进行反向工程。
  • 清单死代码,因此它可以从源代码中删除。
  • 重访定位和预校验现有的类文件的Java 6或更高版本,把他们更快的类加载的充分利用。

这里例如,对于清单死代码: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode



Answer 5:

有一件事我已经知道在Eclipse中做,在一个类,是改变这一切的方法,私下再看看我得到了什么投诉。 对于所使用的方法,这会招来错误,我把它们返回到最低的访问级别,我可以。 对于未使用的方法,这将激起有关未使用的方法警告,然后将这些可以被删除。 作为奖励,你经常会发现,可以而且应该为私有一些公共方法。

但它很手册。



Answer 6:

使用测试覆盖工具来测试您的代码库,然后运行该应用程序本身,而不是测试。

艾玛和Eclemma会给你什么类的代码的任何给定的运行运行有多大比例的很好的报告。



Answer 7:

我们已经开始使用发现错误 ,以帮助确定一些在重构我们的代码库的目标众多的环境中临阵脱逃。 我也会考虑结构101 ,以确定您的代码库的架构过于复杂点,让你知道真正的沼泽是。



Answer 8:

从理论上讲,你不能找到确定性无用的代码。 即使世界的这一个数学证明(当然,这是一个比较普遍定理的一个特例)。 如果您感到好奇,查找停机问题。

这可以以多种方式在Java代码中体现出来:

  • 根据用户的输入,配置文件,数据库条目等加载类;
  • 加载外部代码;
  • 经过物体树木第三方库;
  • 等等

话虽这么说,我用的IntelliJ IDEA作为我的首选IDE,它具有模块之间的依赖关系findign,未使用的方法,未使用的会员,未使用的类等丰富的分析工具,它很聪明太喜欢那不叫私有方法标签未使用的,但公共方法需要更广泛的分析。



Answer 9:

在Eclipse转到窗口>首选项>的Java>编译器>错误/警告
和所有的人都变成错误。 修正所有错误。 这是最简单的方法。 妙处在于,这将允许你为你写清理代码。

截图Eclipse代码:



Answer 10:

的IntelliJ具有用于检测代码是未用的代码分析工具。 你应该尝试使尽可能多的字段/方法/类的非公众可能的,而且会出现更多未使用方法/场/班

我也试图找到重复的代码减少了代码量的一种方式。

我最后的建议是试图找到这要是用来将帮助您简化代码的开源代码。



Answer 11:

所述Structure101 切片透视会给的任何“孤儿”或“孤儿列表(和依赖图) 基团的不具有依赖性或从“主”群类或包”。



Answer 12:

DCD是不是对一些IDE插件,但可以从蚂蚁或独立运行。 它看起来像一个静态的工具, 它可以做什么PMD和FindBugs的不能 。 我会尝试。

PS正如下面的评论中提到,该项目现在住在GitHub上 。



Answer 13:

有哪个配置文件的代码,并提供代码覆盖数据的工具。 这可以让你看到(如代码运行)被多少的叫。 您可以得到任何的这些工具来找出你有多少孤儿的代码有。



Answer 14:

  • FindBugs的是优秀的这样的事情。
  • PMD(项目混乱检测器)是另一种工具,它可以使用。

然而,无论是可以找到的工作空间中的未使用的public static方法 。 如果有人这样一个工具的了解,那么请让我知道。



Answer 15:

用户覆盖工具,如EMMA。 但它不是静态的工具(即它需要实际运行通过回归测试的应用程序,并通过一切可能的错误的情况下,这是很好的,不可能:))

不过,EMMA是非常有用的。



Answer 16:

代码覆盖工具,如爱玛的Cobertura,与四叶草,这其中的部分被通过运行一系列测试调用意志仪器代码和记录。 这是非常有用的,而应该是开发过程的一个组成部分。 这将帮助你确定你的测试套件如何覆盖你的代码。

然而,这是不一样的识别真正的死代码。 它仅识别由测试所覆盖(或不覆盖)码。 这可以给你误报(如果你的测试没有涵盖所有的情况),以及假阴性(如果这实际上是从来没有在真实的场景中使用你的测试接入码)。

我想真正认死代码的最佳方法是用仪器在现场运行环境的覆盖工具代码,并在一段较长时间内分析代码覆盖率。

如果您在负载平衡的冗余环境捉迷藏(如果没有,为什么不呢?),那么我想这将是有意义的唯一工具应用程序的一个实例,并配置您的负载均衡器,使得随机的,但小,部分你的用户在你的仪表实例上运行。 如果你这样做了较长的时间周期(以确保你已经把所有现实世界使用场景 - 比如季节性变化),你应该能够清楚地看到你的代码的区域在现实世界中使用哪些部分访问真的从来没有访问,因此死代码。

我从来没有亲自看到这种情况,不知道上述工具如何使用仪器和分析未通过测试套件调用的代码 - 但我相信他们可以。



Answer 17:

有一个Java项目- 死代码检测 (DCD)。 对于源代码,它似乎并没有很好地工作,但对于.jar文件 - 这是真的很好。 另外,您还可以通过类和方法进行筛选。



Answer 18:

Netbeans的这里是Netbeans的插件死代码检测 。

它会更好,如果它可以链接到并突出显示未使用的代码。 您可以投票,并在这里评论: 臭虫181458 -查找未使用的公共类,方法,字段



Answer 19:

Eclipse可以显示/不能达到高亮度代码。 JUnit的可以告诉你的代码覆盖率,但你需要一些测试,需要决定是否相关的测试丢失或代码确实是不用的。



Answer 20:

我发现三叶草覆盖工具,仪器仪表的代码,并强调所使用的代码和未使用。 与谷歌不同的CodePro Analytics(分析),它也适用于web应用(根据我的经验,我可能是不正确的关于谷歌的CodePro)。

我注意到唯一的缺点是,它并没有采用Java接口考虑。



Answer 21:

我使用Doxygen的开发方法调用的地图来定位不会被调用的方法。 在图表上,你会发现没有来电方法集群的岛屿。 这并不适用于图书馆工作,因为你总是需要一些主入口点开始。



文章来源: How to find unused/dead code in java projects