Xml 阿帕奇蚂蚁赢了';我不会做数学

Xml 阿帕奇蚂蚁赢了';我不会做数学,xml,ant,build-automation,Xml,Ant,Build Automation,我正在使用分布式源代码处理Java中的一个项目,为了正常工作,必须使用自定义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="+">

我正在使用分布式源代码处理Java中的一个项目,为了正常工作,必须使用自定义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>

我试着用谷歌搜索这个错误短语,唯一的结果是,如果操作为null,就会出现这种情况。我尝试按照以下方式更改代码:

<op type="-">


但这些都产生了同样的错误。我改为:

<subtract>

现在没有错误,但结果总是零。 我还尝试将数学节简化为只有一个操作:

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

但问题依然存在

我完全不知所措。有人知道这里发生了什么吗?我正在使用最新版本的Ant${month}和${year}设置正确(我也用硬编码的数字进行了测试,但仍然不起作用)


谢谢

您可以使用诸如或之类的嵌入式脚本语言,它可能比XML更可读、更易于操作

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

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

月=整数.valueOf(属性[“月”])
年份=整数.valueOf(属性[“年份])
物业[“月”]=24097-((年*12)+月)

我对这段代码也有同样的问题。有趣的是,大多数情况下,它确实有效。大约每5次运行构建脚本时,就会发生一次错误

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

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

<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.6R2的实现)并为resuse添加宏定义,即:

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

如何部署这样一个用ant编写的程序?如果有一个编译、测试和分发我在ant中用groovy编写的程序的构建系统……上面的示例使用ant groovy任务。没有什么需要编译的,而且它比xml中的数学更容易阅读、维护和测试……只需根据ANT官方手册中的ANT依赖项列表将jar文件放在类路径中。这很有效,尽管我不得不将groovy的前两行改为
Integer.valueOf(properties[“month”])
。。。我希望有一个修复程序可以让我继续使用其他人正在使用的build.xml文件。。。因为如果他们改变了什么呢?这是一个正在进行的项目。谢谢。如果我在一天内没有得到另一个答案,我会接受这个答案。您使用的java运行时版本是什么?
<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>
project.setUserProperty()