2

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

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

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

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

沃尔特

4

5 回答 5

2

我不确定我得到了一切,但是...

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

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

于 2010-01-12T00:48:29.093 回答
1

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

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

于 2010-01-12T00:10:15.677 回答
0

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

于 2010-06-15T16:57:08.807 回答
0

你也许可以看看sonar

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

于 2013-03-21T10:07:47.527 回答
-1

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

“Code Duplicate Detector 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

于 2020-01-03T05:21:53.043 回答