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