我们如何使用类似于 Intellij 的 Netbeans 查找重复代码?

How can we find duplicate code using Netbeans similar to Intellij?

有很多重复代码,包括:

Duplicates within file
Duplicates within package
Duplicates around multiple packages
Duplicates around separate Maven Modules

有没有办法使用 Netbeans 8+ 或 Netbeans 插件或 Maven 插件与 Netbeans 或类似于 Intellij 的独立工具来查找重复代码?

我找不到相同的文档。

我在 Maven 中找到了 PMD,但无法 link 使用 Netbeans 8.2,我们只应该使用 Netbeans

您可以使用 Apache Maven PMD Plugin 查找 NetBeans Maven 项目的重复代码。只需将以下内容添加到项目的 pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
            <version>2.7.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>check</goal>
                        <goal>cpd-check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
            <version>2.7.1</version>
        </plugin>
    </plugins>
</reporting>    

当您构建项目时,PMD 的复制粘贴检测器 (CPD) 将为 运行,并将其结果写入文件 {项目目录}\target\cpd.xml。如果没有发现重复文件,则文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<pmd-cpd>
</pmd-cpd>

但是,如果发现重复,文件看起来类似于:

<?xml version="1.0" encoding="UTF-8"?>
<pmd-cpd>
<duplication lines="162" tokens="608">
<file line="95" path="D:\NetBeansProjectsJava9\checkduplication\src\main\java\com\unthreading\checkduplication\ParseJavadoc.java"/>
<file line="258" path="D:\NetBeansProjectsJava9\checkduplication\src\main\java\com\unthreading\checkduplication\ParseJavadoc.java"/>
<codefragment>
<![CDATA[

    ...details of the duplicated code....

]]>
</codefragment>
</duplication>
</pmd-cpd>

如上所述更新 POM 后,验证重复检测是否正常工作的一个非常简单的方法是 copy/paste 一些 class 中的一个大方法,然后给粘贴的方法另一个名称这样代码仍然可以编译。我试过了,在 Output window:

中得到了以下结果

maven-pmd-plugin:2.7.1:cpd-check (default) @ checkduplication ---

BUILD FAILURE

Total time: 2.689 s Finished at: 2018-02-15T17:06:23-05:00 Final Memory: 20M/70M

Failed to execute goal org.apache.maven.plugins:maven-pmd-plugin:2.7.1:cpd-check (default) on project checkduplication: You have 1 CPD duplication. For more details see:D:\NetBeansProjectsJava9\checkduplication\target\cpd.xml -> [Help 1]

最后几点:

  • 指定 <goal>cpd-check</goal>(就像我所做的那样)导致构建在检测到重复时失败,但是 alternative goals can be specified.

  • maven-pmd-plugin2.7.1 有更新的版本,但那是copy/paste 检测开箱即用的最新版本。较新的版本在玩过配置后可能会工作,但我没有尝试过。