Apache Ant不会做数学



我正在使用分布式源代码在Java项目上工作,并且必须使用自定义Ant脚本构建源代码才能正常工作。问题是,当我运行脚本时,我得到

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

第47-59行read:

<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>

我试着搜索错误短语,唯一的结果是MathTask.java的Ant源,其中显示如果操作为空,则应该发生这种情况。我试着把代码改成:

<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}的设置是正确的(我也测试了硬编码的数字,它仍然不工作)。

谢谢!

我在这段代码中遇到了同样的问题。有趣的是,大多数时候它确实有效。当我运行构建脚本时,这个错误大约每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>

到目前为止它是有效的。让我们看看有多长:)我将删除我的答案,如果它不工作。

您不需要额外的ant任务或额外的脚本语言,只需使用java附带的内置javascript脚本引擎(自jdk 1.6起,Sun自己基于rhino 1.6 r2的实现)并放入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(=那些在命令行上通过ant -f foobar.xml -Dmyuserproperty=foo…定义的属性),您必须使用

方法
project.setUserProperty()

您可以使用嵌入式脚本语言,如Jython或Groovy,它们可能比XML更具可读性和更易于操作。

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

相关内容

  • 没有找到相关文章