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



我有以下脚本:

<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循环内部,就像上面的注释一样。

你知道怎么做吗?

<groovy>作用域中有一些绑定对象(有关更多详细信息,请参阅文档),更具体地说,还有ant对象,它是AntBuilder的实例(请参阅此处的api),使用此对象可以调用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>

根据评论编辑:

通过org.apache.tools.ant.Project方法将参数传递给ant调用是不可能的,但还有另一种方法可以做到这一点,通过AntBuilder使用antantcall任务,使用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>

如果你用ant targetSampe执行这个<groovy>目标示例,你会得到:

targetTest:
     [echo] param1=theParamValue
BUILD SUCCESSFUL
Total time: 0 seconds

希望这有帮助,

相关内容

  • 没有找到相关文章

最新更新