使用<groovy> </groovy>从另一个目标调用ant目标

时间:2014-10-30 10:56:11

标签: ant groovy

我有以下脚本:

<target name="query">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="libraries"/>

    <groovy>
    import groovy.sql.Sql

    def sql = Sql.newInstance("jdbc:oracle:thin:@mydomain.com:1521:alias", "test", "test", "oracle.jdbc.pool.OracleDataSource")

    List productNames = sql.rows("SELECT name from PRODUCT")

    //println(productNames.count)

    productNames.each {
        println it["name"]
        // HOW TO INVOKE ANT TARGET TASK HERE? TARGET TASK WILL USE it["name"] VALUE
    }

    properties."productNames" = productNames
    </groovy>
</target>

<target name="result" depends="query">
    <echo message="Row count: ${productNames}"/>
</target>

我想从“查询”目标调用另一个ant目标。特别是在productNames循环中,就像上面的评论一样。

你知道怎么做吗?

1 个答案:

答案 0 :(得分:2)

<groovy>范围(see the documentation for more details)中有一些绑定对象,更具体地说,ant对象是AntBuilder的实例(see the api here ),使用此对象,您可以调用getProject()方法来获取org.apache.tools.ant.Project的实例,使用此Project,您可以使用executeTarget(java.lang.String targetName)方法执行传递其名称的其他目标。所有这些一起看起来像:ant.getProject().executeTarget("yourTargetName")并且在您的代码中:

<target name="query">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="libraries"/>
        <groovy>
            import groovy.sql.Sql

            def sql = Sql.newInstance("jdbc:oracle:thin:@mydomain.com:1521:alias", "test", "test", "oracle.jdbc.pool.OracleDataSource")

            List productNames = sql.rows("SELECT name from PRODUCT")

            //println(productNames.count)

            productNames.each {
                println it["name"]
                ant.getProject().executeTarget("yourTargetName")
            }

            properties."productNames" = productNames
        </groovy>
</target>

基于评论的编辑:

将参数传递给ant,通过org.apache.tools.ant.Project方法调用它是不可能的,但是还有另一种方法可以通过{{1使用antantcall任务},使用AntBuilder然而antcall内部不支持它如果您尝试使用它,则会收到以下错误消息:

<groovy>

所以你必须使用antcall not supported within AntBuilder, consider using 'ant.project.executeTarget('targetName')' instead 任务。例如,如果您的跟踪蚂蚁目标中包含ant中的参数:

build.xml

你可以从<target name="targetTest"> <echo message="param1=${param1}"/> </target> 调用它来传递这样的参数:

<groovy>

如果您使用<target name="targetSample"> <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="groovyLibs"/> <groovy> ant.ant(antfile:'build.xml'){ // you antfile name target(name:'targetTest') // your targetName property(name:'param1',value:'theParamValue') // your params name and values } <groovy> </target> 执行此<groovy>目标示例,则会获得:

ant targetSampe

希望这有帮助,