2014-10-30 40 views
0

我有以下腳本:從另一個目標調用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循環中,就像上面的註釋一樣。

你有什麼想法該怎麼做?

回答

2

中有<groovy>範圍(see the documentation for more details),更具體地有ant對象,它是的AntBuildersee 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> 

編輯基於評論:

將參數傳遞給螞蟻調用它通過org.apache.tools.ant.Project方法是不可能的,但有另一種方式來做到這一點使用antantcall任務通過AntBuilder,使用antcall但它不是內<groovy>支持,如果你嘗試使用它,你將收到此錯誤信息:

antcall not supported within AntBuilder, consider using 'ant.project.executeTarget('targetName')' instead 

所以你必須使用ant任務。例如,如果您有遵循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您將獲得:

targetTest: 
    [echo] param1=theParamValue 

BUILD SUCCESSFUL 
Total time: 0 seconds 

希望這有助於

+0

感謝提示。你知道我怎麼可以在executeTarget方法中將參數添加到「yourTargetName」任務中?我沒有看到任何額外的參數。 – bontade 2014-10-31 11:12:38

+1

我會更新我的答案以適應您的新要求':)' – albciff 2014-11-04 09:48:28

相關問題