我有以下脚本:
<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循环中,就像上面的评论一样。
你知道怎么做吗?
答案 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使用ant
或antcall
任务},使用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
希望这有帮助,