Apache Ant不会做数学

Mal*_*ean 3 xml ant build-automation

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

BUILD FAILED
C:\[path]\autobuild.xml:47: Only 1 operation can be specified
Run Code Online (Sandbox Code Playgroud)

第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>
Run Code Online (Sandbox Code Playgroud)

我试过谷歌搜索错误短语,唯一的结果是MathTask.javaAnt源,它表明如果操作为null,这将是应该发生的.我尝试按以下方式更改代码:

<op type="-">
Run Code Online (Sandbox Code Playgroud)

要么

<op op="subtract">
Run Code Online (Sandbox Code Playgroud)

但是这些产生了同样的错误.我改为改为:

<subtract>
Run Code Online (Sandbox Code Playgroud)

现在没有错误,但结果始终为零.我也试过将数学节简化为只有一个操作:

<math result="months" datatype="int">
    <op op="subtract">
        <num value="27940"/>
        <num value="24123"/>
    </op>
</math>
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在.

我完全不知所措.有没有人知道这里发生了什么?我正在使用最新版本的Ant ... $ {month}和$ {year}已正确设置(我还使用硬编码测试,但仍然无法正常工作).

谢谢!

T3r*_*rm1 6

我对这段代码有同样的问题.有趣的是,大多数时候它确实有效.每运行一次构建脚本,第5次出现错误.

<math datatype="int" result="rndNum">
    <op op="+">
        <num value="42000" />
        <op op="*">
           <num value="1000"/>
           <op op="random"/>
        </op>               
    </op>
</math>
Run Code Online (Sandbox Code Playgroud)

我从数学任务中删除了datatype属性并将其放在第一个操作中.

<math result="rndNum">
    <op datatype="int" op="+">
        <num value="42000" />
        <op op="*">
           <num value="1000"/>
           <op op="random"/>
        </op>               
    </op>
</math>
Run Code Online (Sandbox Code Playgroud)

到目前为止它的作用.让我们看看多久:)如果它不起作用我会删除我的答案.


Reb*_*bse 5

您不需要额外的 ant 任务或额外的脚本语言,只需使用 java 附带的内置 javascript 脚本引擎(自 jdk 1.6 起,Sun 自己的基于 rhino 1.6R2 的实现)并放入一个宏定义以供重用,即:

<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>
Run Code Online (Sandbox Code Playgroud)

如果您需要覆盖现有的用户属性(= 通过 ant -f foobar.xml -Dmyuserproperty=foo ... 在命令行上定义的那些属性),您必须使用该方法

project.setUserProperty()
Run Code Online (Sandbox Code Playgroud)