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.java的Ant源,它表明如果操作为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}已正确设置(我还使用硬编码测试,但仍然无法正常工作).
谢谢!
我对这段代码有同样的问题.有趣的是,大多数时候它确实有效.每运行一次构建脚本,第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)
到目前为止它的作用.让我们看看多久:)如果它不起作用我会删除我的答案.
您不需要额外的 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)