如何从Gradle构建中运行JBoss TattleTale

时间:2014-11-20 17:29:43

标签: gradle tattletale

我爱上了JBoss TattleTale。通常,在我的Ant构建中,我follow the docs来定义Tattletale任务,然后像这样运行它们:

<taskdef name="report"
    classname="org.jboss.tattletale.ant.ReportTask"
    classpathref="tattletale.lib.path.id"/>

...

<tattletale:report source="${src.dir]" destination="${dest.dir}"/>

我现在正在将我的构建转换为Gradle,并且正在努力弄清楚如何让Tattletale在Gradle中运行。似乎没有Gradle-Tattletale插件,而且我没有足够的经验与Gradle贡献一个。但我也知道Gradle可以运行任何Ant插件,也可以从系统shell执行东西;我只是不确定如何在Gradle中执行此操作,因为此处(尚未)没有任何文档。

所以我问:如何从Gradle构建中运行Tattletale ReportTask


更新

以下是Gradle / Ant文档显示的示例:

task loadfile << {
    def files = file('../antLoadfileResources').listFiles().sort()
    files.each { File file ->
        if (file.isFile()) {
            ant.loadfile(srcFile: file, property: file.name)
            println " *** $file.name ***"
            println "${ant.properties[file.name]}"
        }
    }
}

但是,我在这里没有看到如何/在哪里为Tattletale及其ReportTask自定义此内容。

2 个答案:

答案 0 :(得分:1)

以下内容改编自https://github.com/roguePanda/tycho-gen/blob/master/build.gradle

它绕过ant并直接调用Tattletale Java类。

它被更改为处理WAR,并强制要求更新的javassist以处理Java 8功能,例如lambdas。

configurations {
    tattletale
}

configurations.tattletale {
    resolutionStrategy {
        force 'org.javassist:javassist:3.20.0-GA'
    }
}

dependencies {
    // other dependencies here...
    tattletale "org.jboss.tattletale:tattletale:1.2.0.Beta2"
}

task createTattletaleProperties {
    ext.props = [reports:"*", enableDot:"true"]
    ext.destFile = new File(buildDir, "tattletale.properties")
    inputs.properties props
    outputs.file destFile
    doLast {
        def properties = new Properties()
        properties.putAll(props)
        destFile.withOutputStream { os ->
            properties.store(os, null)
        }
    }
}

task tattletale(type: JavaExec, dependsOn: [createTattletaleProperties, war]) {
    ext.outputDir = new File(buildDir, "reports/tattletale")
    outputs.dir outputDir
    inputs.files configurations.runtime.files
    inputs.file war.archivePath
    doFirst {
        outputDir.mkdirs()
    }
    main = "org.jboss.tattletale.Main"
    classpath = configurations.tattletale
    systemProperties "jboss-tattletale.properties": createTattletaleProperties.destFile
    args([configurations.runtime.files, war.archivePath].flatten().join("#"))
    args outputDir
}

答案 1 :(得分:0)

之前的答案要么不完整要么过于复杂。我做的是使用gradle中的ant任务,它工作得很好。让我们假设你的tattletale罐子在rootDir / tools /...

之下
ant.taskdef(name: "tattleTaleTask", classname: "org.jboss.tattletale.ant.ReportTask", classpath: "${rootDir}/tools/tattletale-1.1.2.Final/tattletale-ant.jar:${rootDir}/tools/tattletale-1.1.2.Final/tattletale.jar:${rootDir}/tools/tattletale-1.1.2.Final/javassist.jar")
sources = "./src:./src2:./etcetera"
ant.tattleTaleTask(
    source: sources,
    destination: "tattleTaleReport",
    classloader: "org.jboss.tattletale.reporting.classloader.NoopClassLoaderStructure",
    profiles: "java5, java6",
    reports: "*",
    excludes: "notthisjar.jar,notthisjareither.jar,etcetera.jar"
    ){

    }

因此上面的代码将在./tattleTaleReport下生成报告。就这么简单。令人烦恼的是 source 变量只接受目录,所以如果你不想扫描那些目录中存在jar,你需要将它们添加到排除参数。