【问题标题】:Apache Ant won't do mathApache Ant 不会做数学
【发布时间】:2011-11-09 00:37:40
【问题描述】:

我正在使用分布式源代码处理 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>

我尝试用谷歌搜索错误短语,唯一的结果是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} 已正确设置(我还使用硬编码数字进行了测试,但仍然无法正常工作)。

谢谢!

【问题讨论】:

  • 你使用的java运行时版本是什么?

标签: xml ant build-automation


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您不需要额外的 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>
    

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

    project.setUserProperty()
    

    【讨论】:

    • 完美运行。虽然它在未来可能不起作用:有一个弃用警告。 [script] Warning: Nashorn engine is planned to be removed from a future JDK release
    【解决方案3】:

    您可以改用 JythonGroovy 等嵌入式脚本语言,这可能比 XML 更易读且更易于操作。

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

    【讨论】:

    • 如何部署这样一个用ant编写的程序?要是有一个构建系统来编译、测试和分发我用 groovy-in-ant 编写的程序就好了……
    • 上面的例子使用了 Ant Groovy 任务。无需编译,比 math-in-xml 更易于阅读、维护和测试...
    • 只要按照ANT官方手册中的ANT依赖列表把jar文件放到你的classpath中即可。
    • 这行得通,虽然我不得不将前两行更改为Integer.valueOf(properties["month"]) ...我希望有一个修复程序可以让我继续使用与其他人相同的 build.xml 文件正在使用...因为如果他们改变了一些东西怎么办?这是一个正在进行的项目。
    • 谢谢。如果我在一天内没有得到另一个答案,我会接受这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多