Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant 使用PMD';s带刻度的复制/粘贴检测器_Ant_Gradle_Pmd - Fatal编程技术网

Ant 使用PMD';s带刻度的复制/粘贴检测器

Ant 使用PMD';s带刻度的复制/粘贴检测器,ant,gradle,pmd,Ant,Gradle,Pmd,我想在我的Gradle版本中使用复制/粘贴检测器 这就是为什么我决定将以下Ant任务(我发现的)转换为Gradle语法: <target name="cpd"> <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" /> <cpd minimumTokenCount="100" outputFile="/home/tom/cpd.txt"> <fil

我想在我的Gradle版本中使用复制/粘贴检测器

这就是为什么我决定将以下Ant任务(我发现的)转换为Gradle语法:

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" />
    <cpd minimumTokenCount="100" outputFile="/home/tom/cpd.txt">
        <fileset dir="/home/tom/tmp/ant">
            <include name="**/*.java"/>
        </fileset>
    </cpd>
</target>

以下是当前翻译的外观:

check << {
        ant.taskdef(name: 'cpd', classname: 'net.sourceforge.pmd.cpd.CPDTask', classpath: configurations.pmd.asPath)
        ant.cpd(minimumTokenCount: '100', outputFile: file('build/reports/pmd/copyPasteDetector.txt').toURI().toString()) {
            fileset(dir: 'src'){
                include(name: '**.java')
        }
    }
}
检查来自的人建议你在gradle中使用CPD,如下所示:

task cpd(dependsOn: ':pmdSetup') {
    // Combine all source sets
    allSource = files {
        allprojects.findAll { proj ->
            proj.hasProperty("sourceSets")
        }.collect { proj ->
            proj.sourceSets.collect { ss ->
                ss.java
            }
        }
    }
    // Declare this task's inputs and outputs.
    inputs.files allSource
    outDir = file("$buildDirName/cpd")
    outputs.dir outDir
    //    outputs.files file("$outDir.path/cpd.xml")
    doLast {
        outDir.mkdirs()
        // Keep a reference to the gradle project for use inside the
        // ant closure, where "project" refers to the ant project.
        gproj = project
        ant {
            cpd(minimumTokenCount: '100', format: 'xml',
                    outputFile: outDir.path + '/cpd.xml') {
                fileset(dir: projectDir.getPath()) {
                    // Convert the gradle sourceSet to an ant
                    // fileset.
                    allSource.each { file ->
                        include(name: gproj.relativePath(file))
                    }
                }
            }
        }
    }
}

当然,
apply plugin:'pmd'
之前就有了。

我的
输出文件的定义造成了这个问题

我对此进行了调整,现在我对以下解决方案感到满意:

check << {
    File outDir = new File('build/reports/pmd/')
    // Make sure the output dir exists to prevent a ReportException
    outDir.mkdirs()

    ant.taskdef(name: 'cpd', classname: 'net.sourceforge.pmd.cpd.CPDTask',
                classpath: configurations.pmd.asPath)

    ant.cpd(minimumTokenCount: '100', format: 'text', 
        outputFile: new File(outDir , 'cpd.txt')) {
        fileset(dir: "src/main/java") {
            include(name: '**/*.java')
        }
    }
}

检查您也可以使用my gradle cpd插件。有关更多信息,请参阅。应用
cpd
插件会自动将
cpd
添加为
check
任务的依赖项

注意:我对扩展名(参见工具版本)和任务的名称
cpd
不太满意,欢迎您提出建议;-)

目前,它是0.1版,但我正在使用它,从内部使用CPD的ant任务切换到直接调用它。这将包括对所有参数的支持等。下面是一个使用示例:

apply plugin: 'cpd'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'de.aaschmid.gradle.plugins:gradle-cpd-plugin:0.1'
    }
}

// optional - default is 5.1.0
cpd {
    toolVersion = '5.0.5'
}

tasks.cpd {
    reports {
        text.enabled = true
        xml.enabled = false
    }
    source = files('src/main/java')
}