【问题标题】:CPD / PMD between projects?项目之间的 CPD / PMD?
【发布时间】:2009-12-31 18:31:29
【问题描述】:

希望我重新表述这个问题,使其更简单易懂。

我有大约 30 个组件(内部)进入一个 Web 应用程序。这意味着 30 个不同的项目都有自己独立的 POM。我在我的 POM 中使用了相当多的继承,因此它们继承的其中一项是 PMD/CPD 配置以防止代码重复。

即使我运行了 CPD/PMD,它也只能检测到同一项目中的重复代码。我希望它能够检测我的任何项目中是否存在可以重构的项目之间共享的代码。此外,我一直在寻找可以(使用相同的概念/模式)验证其他开源依赖项之间没有共享代码的东西。

它将是 CPD/PMD,但它会在源 jar 上运行。如果您扫描所有项目及其依赖项以查找重复项,此任务将消耗大量内存。现在,我只想将其应用于内部项目。如果它有效,那么扩展它会相对容易/直接。

沃尔特

【问题讨论】:

  • 你能澄清一下这个问题吗?
  • 您需要一个重复代码检测器。当然,PMD 是你的野兽,你已经完成了。听起来您想对 WAR 文件进行逆向工程以将其源代码(如何将字节码翻译成看起来像原始源?这听起来没有必要、无法实现并且完全没用)与其他源代码进行比较,或者只是比较它的源代码字节码与您的字节码。为什么不直接比较你得到的源代码呢?
  • 另外,在某些情况下尝试对代码进行逆向工程可能存在法律问题。

标签: java maven-2 code-duplication pmd similarity


【解决方案1】:

我不确定我得到了所有东西,但是......

我将创建一个将所有项目作为依赖项的聚合模块,使用 maven-dependency-pluginunpack-dependencies mojo 来获取所有依赖项源 jar(mojo 可以将分类器作为参数)并解压它们(可能在target/generated-sources/javamaven build helper plugin 在这里可能会有所帮助)最后在整个源代码库上运行 pmd:cpd

这可能需要一些调整,我根本没有测试过。

【讨论】:

  • 帕斯卡,感谢您的 cmets。我将来会尝试一下。这听起来是我目前最好的选择。如果可行,也许我应该回馈 pmd:cpd 插件。我知道大多数组织不会像这样拆分项目,但是任何重复的代码都是浪费时间重新发明轮子,这会导致更多的错误和颠簸。
  • 您的用例是完全有效的恕我直言。对跨多个模块的代码运行相似性分析器确实很有意义。
【解决方案2】:

听起来您想在 30 个项目中的任何地方找到重复的代码。我不能代表 PMD;我假设您告诉它创建一个包含来自项目联合的所有源文件的巨型项目。但是,是的,这会占用大量 RAM 和 CPU。

另一个工具是Java CloneDR。无论源代码布局或干预 cmets 如何,CloneDR 都会查找重复代码,无论它是完全相同还是接近(例如,一些编辑)。设置它来处理您的项目集中的所有文件非常容易。

【讨论】:

  • 是的,艾拉,这是正确的。我有 30 个项目被拆分出来,这样我可以更好地了解项目之间的关系以及将关注点隔离开来。但是对于我必须更新 pom 的频率来说,这很痛苦,但是该项目更加模块化。子项目更加专注,目标明确。
【解决方案3】:

只需将 PMD:CPD 作为独立程序运行即可。它所需要的只是一个目录,它会递归。至少,它对我有用。我将所有源代码移动到一个目录,并从与 PMD-4.2.5 一起分发的批处理文件中运行 CPD gui。

【讨论】:

    【解决方案4】:

    你或许可以看看sonar

    Sonar-CPD 引擎更具可扩展性,可以检测跨项目重复。

    【讨论】:

      【解决方案5】:

      您可以尝试使用 Lizard for Python。 但是,它不适用于源 jar。

      “代码重复检测器 lizard -Eduplicate {path to your code}"

      https://pypi.org/project/lizard/

      PMD/CPD 提供了更高的粒度,因为它允许用户在将代码块标记为重复之前指定令牌的数量。

      https://pmd.github.io/latest/pmd_userdocs_cpd.html#cli-options-reference

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 已更新。无论如何,正如您所见,文档中没有什么内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2021-08-23
      相关资源
      最近更新 更多