Java Gradle:从自定义任务调用ant

Java Gradle:从自定义任务调用ant,java,ant,gradle,wsimport,Java,Ant,Gradle,Wsimport,我是gradle的新手,正在尝试迁移我们目前基于Maven的自动化JAX-WS客户端构建项目,因为gradle似乎为我们配置新项目的构建提供了一种更简单的方法 我遵循本教程,能够为WSDL端点生成客户机类。我现在想要实现的是将任务定义放在一个新的DefaultTask类中,以保持build.gradle文件更干净,因此我创建了以下文件,将其放在一个新的Groovy项目中,并使其可用于我的构建: class WsimportTask extends DefaultTask { def Li

我是gradle的新手,正在尝试迁移我们目前基于Maven的自动化JAX-WS客户端构建项目,因为gradle似乎为我们配置新项目的构建提供了一种更简单的方法

我遵循本教程,能够为WSDL端点生成客户机类。我现在想要实现的是将任务定义放在一个新的DefaultTask类中,以保持build.gradle文件更干净,因此我创建了以下文件,将其放在一个新的Groovy项目中,并使其可用于我的构建:

class WsimportTask extends DefaultTask {
    def List<String> wsdlUrls
    @OutputDirectory
    File destDir

    @TaskAction
    def wsimport() {
        wsdlUrls.each() {
            println "run wsimport for "+ it
            ant {
                sourceSets.main.output.classesDir.mkdirs()  
                destDir.mkdirs()
                taskdef(name:'wsimport',
                    classname:'com.sun.tools.ws.ant.WsImport',
                    classpath:configurations.jaxws.asPath)
                wsimport(keep:true,
                    destdir: sourceSets.main.output.classesDir,
                    sourcedestdir: destDir,
                    wsdl: it)
            }
        }
    }
}
子项目本身应该只需要包含以下配置:

子项目构建。梯度

subprojects {
    configurations {
        wsimport
    }
    dependencies {
        wsimport group: 'com.mycompany.gradle', name: 'tasks', version: '0.0.2-SNAPSHOT'
    }
    task wsimport(type: com.mycompany.gradle.WsimportTask) {
        destDir = file("${buildDir}/generated")
    }
    compileJava.dependsOn(wsimport)
}
buildscript {
    wsimport {
        wsdlUrls = [
            "http://...endpoint1.wsdl",
            "http://...endpoint2.wsdl"
        ]
    }
}
在主项目上运行gradle clean build时,我收到以下消息和异常:

:clean UP-TO-DATE 
:Subproject:clean 
:Subproject:wsimport 
run wsimportfor http://endpoint1.wsdl 
:Subproject:wsimport 
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':Subproject:wsimport'.
....
FAILED Caused by: org.gradle.api.internal.MissingMethodException: Could not find method ant() for arguments [com.mycompany.gradle.WsimportTask$_wsimport_closure1_closure2@16caac05] on task ':Subproject:wsimport'.
因此gradle了解我的配置,应用WSDL端点并调用我的自定义任务。然后将ant{}求值为一个调用方法ant()的本地方法,该方法不存在。这对我来说非常有意义,但是如何实现从这个定制gradle任务中调用实际ant wsimport任务的目标呢


解决方案谢谢彼得的回答。我想我确实开始了解任务是如何连接到我的构建脚本中的。我为未来的奋斗者粘贴了完整的任务,因为我不认为创建这样一个任务的整个过程(尤其是第一次)有点难以理解:

class WsimportTask extends DefaultTask {
    def List<String> wsdlUrls
    @OutputDirectory
    File outDir

    @TaskAction
    def wsimport() {
        wsdlUrls.each() {
            def temp = it
            println "run wsimport for "+ temp
            project.sourceSets.main.output.classesDir.mkdirs()  
            outDir.mkdirs()
            def classpath = project.configurations.jaxws.asPath
            def destDir = project.sourceSets.main.output.classesDir
            project.ant {
                taskdef(name:'wsimport',
                    classname:'com.sun.tools.ws.ant.WsImport',
                    classpath:classpath)
                wsimport(keep:true,
                    destdir: destDir,
                    sourcedestdir: outDir,
                    wsdl: temp)
            }
        }
    }
}
类WsimportTask扩展了DefaultTask{ 定义列表wsdlurl @输出目录 文件输出目录 @任务行动 def wsimport(){ wsdlurl.each(){ def temp=it println“运行wsimport for”+temp project.sourceset.main.output.classesDir.mkdirs() outDir.mkdirs() def classpath=project.configurations.jaxws.asPath def destDir=project.sourceset.main.output.classesDir 蚂蚁计划{ taskdef(名称:'wsimport', 类名:'com.sun.tools.ws.ant.WsImport', 类路径:类路径) wsimport(keep:true, destdir:destdir, sourcedestdir:outDir, wsdl:temp) } } } } 同样值得注意的是,任务不能在build.gradle文件的buildscipt块中定义,就像Peter指出的那样


@TaskAction
def wsimport() {
    wsdlUrls.each() {
        println "run wsimport for "+ it

        sourceSets.main.output.classesDir.mkdirs()  
        destDir.mkdirs()

        ant.taskdef(name:'wsimport',
                classname:'com.sun.tools.ws.ant.WsImport',
                classpath:configurations.jaxws.asPath)
        ant.wsimport(keep:true,
                destdir: sourceSets.main.output.classesDir,
                sourcedestdir: destDir,
                wsdl: it)       
    }
}

与构建脚本不同,任务或插件类没有隐式的
Project
上下文。因此,它是
project.ant
project.file
,等等。此外,任务必须在
buildscript
块之外声明和配置(请参见子项目
build.gradle