我有以下脚本:
<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
使用ant
或antcall
任务,使用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
希望这有帮助,