2011-11-09 63 views
2

我正在使用分佈式源來處理Java中的項目,並且必須使用自定義Ant腳本構建源以便正常工作。問題是,當我運行該腳本,我得到Apache Ant不會做數學

BUILD FAILED 
C:\[path]\autobuild.xml:47: Only 1 operation can be specified 

線47-59讀:

<math result="months" datatype="int"> 
    <op op="-"> 
     <op op="+"> 
      <num value="${month}"/> 

      <op op="*"> 
       <num value="${year}"/> 
       <num value="12"/> 
      </op > 
     </op> 
     <num value="24097"/> 
    </op> 
</math> 

我試着用搜索引擎的錯誤短語和唯一的結果就是Ant source of MathTask.java它顯示如果操作爲空,這是應該發生的事情。我試圖沿着線改變代碼:

<op type="-"> 

<op op="subtract"> 

但這些所產生的同樣的錯誤。我將其改爲:

<subtract> 

現在沒有錯誤,但結果始終爲零。 我也試着減少數學節以僅具有一個操作:

<math result="months" datatype="int"> 
    <op op="subtract"> 
     <num value="27940"/> 
     <num value="24123"/> 
    </op> 
</math> 

但問題仍然存在。

我完全不知所措。有沒有人有任何線索這裏發生了什麼?我正在使用最新版本的Ant ... $ {month}和$ {year}已正確設置(我也使用硬編碼數字進行了測試,但仍無法正常工作)。

謝謝!

+0

什麼是您正在使用的Java運行時版本? – FailedDev

回答

0

我認爲這正好顯示了Ant不應該用作編程語言的原因。 :-)

您應該使用嵌入式腳本語言,如JythonGroovy

<groovy> 
month = Integer.valueOf(properties["month"]) 
year = Integer.valueOf(properties["year"]) 

properties["months"] = 24097 - ((year * 12) + month) 
</groovy> 
+0

如何部署這樣一個用ant編寫的程序?如果只有一個編譯系統可以編譯,測試和分發用groovy-in-ant編寫的程序... – phihag

+0

上面的例子使用Ant Groovy任務。沒有什麼可以編譯的,它比xth數學運算更容易閱讀,維護和測試...... –

+1

根據ANT官方手冊中的ANT依賴關係列表,將jar文件放入你的類路徑中。 – coolcfan

5

我對這段代碼有同樣的問題。有趣的是,它大部分時間工作。大約每隔5次運行我的構建腳本時就會發生錯誤。

<math datatype="int" result="rndNum"> 
    <op op="+"> 
     <num value="42000" /> 
     <op op="*"> 
      <num value="1000"/> 
      <op op="random"/> 
     </op>    
    </op> 
</math> 

我刪除從數學任務數據類型屬性,並把它放在第一議定書。

<math result="rndNum"> 
    <op datatype="int" op="+"> 
     <num value="42000" /> 
     <op op="*"> 
      <num value="1000"/> 
      <op op="random"/> 
     </op>    
    </op> 
</math> 

到目前爲止它的工作原理。讓我們看看多久:)如果它不起作用,我會刪除我的答案。

3

您不需要額外的Ant任務或其它腳本語言,只要使用內置的JavaScript腳本引擎的Java附帶了(因爲JDK 1.6,Sun公司自己實現了基於犀牛1.6R2),並把在resuse一個macrodef,即:

<project> 
    <property name="foo" value="22"/> 
    <echo>$${foo} => ${foo}</echo> 

    <!-- create macrodef --> 
    <macrodef name="math"> 
    <attribute name="operation"/> 
    <attribute name="operator1"/> 
    <attribute name="operator2"/> 
    <attribute name="result"/> 
    <sequential> 
    <script language="javascript"> 
    tmp = 0; 
    switch ("@{operation}") 
    { 
     case "+" : 
     tmp = parseInt("@{operator1}") + parseInt("@{operator2}"); 
     break; 
     case "-" : 
     tmp = parseInt("@{operator1}") - parseInt("@{operator2}"); 
     break; 
     case "*" : 
     tmp = parseInt("@{operator1}") * parseInt("@{operator2}"); 
     break; 
     case "/" : 
     tmp = parseInt("@{operator1}")/parseInt("@{operator2}"); 
     break; 
    } 
    project.setProperty("@{result}", tmp); 
    </script> 
    </sequential> 
</macrodef> 

    <!-- create new properties --> 
    <math operation="/" operator1="${foo}" operator2="11" result="foooo"/> 
    <math operation="+" operator1="${foo}" operator2="21" result="fooo"/> 
    <!-- overwrite existing property foo --> 
    <math operation="+" operator1="${foo}" operator2="1" result="foo"/> 
    <echo> 
    create => $${fooo} => ${fooo} 
    create => $${foooo} => ${foooo} 
    overwrite => $${foo} => ${foo} 
    </echo> 
</project> 

如果需要覆蓋現有userproperty(=通過螞蟻在命令行中定義這些屬性-f foobar.xml -Dmyuserproperty =富...)您必須使用方法

project.setUserProperty()