Uso integrato (dal JDK 6) motore javascript, non sono necessarie librerie aggiuntive (antcontrib, ecc.)!
1. Java System.exit()
<script language="javascript">
self.log("Ending intentionally \n...\n..\n.");
java.lang.System.exit(0);
</script>
si può ottenere una generazione non riuscita durante l'esecuzione in Eclipse: generazione non riuscita javax.script.ScriptException: sun.org.mozilla. javascript.internal.WrappedException: org.eclipse.ant.internal.launching.remote.AntSecurityException Wrapped => quindi utilizzare API Ant invece
2. api Ant
<script language="javascript">
self.log("Ending intentionally \n...\n..\n.");
project.fireBuildFinished(null);
</script>
uscita di Eclipse, viene stampato nessun BUILD SUCCESSFUL:
[script] Ending intentionally
[script] ...
[script] ..
[script] .
Total time: 410 milliseconds
uscita della console, COSTRUIRE successo è stampato 2 volte:
[script] Ending intentionally
[script] ...
[script] ..
[script] .
BUILD SUCCESSFUL
Total time: 0 seconds
BUILD SUCCESSFUL
Total time: 0 seconds
Wrap in un macrodef per il riutilizzo, fe:
<macrodef name="stopbuild">
<attribute name="condition"/>
<attribute name="paramtype" default="math"/>
<attribute name="param1"/>
<attribute name="param2"/>
<attribute name="when" default="true"/>
<sequential>
<script language="javascript">
falsecondition = false;
switch ("@{condition}")
{
case "lt" :
b = "@{paramtype}" == "math" ? parseInt("@{param1}") < parseInt("@{param2}") : "@{param1}" < "@{param2}";
break;
case "gt" :
b = "@{paramtype}" == "math" ? parseInt("@{param1}") > parseInt("@{param2}") : "@{param1}" > "@{param2}";
break;
case "eq" :
b = "@{paramtype}" == "math" ? parseInt("@{param1}") == parseInt("@{param2}") : "@{param1}" == "@{param2}";
break;
default:
self.log("Wrong condition : @{condition}, supported: lt, gt, eq");
falsecondition = true;
}
if(!falsecondition && b == java.lang.Boolean.valueOf("@{when}")) {
self.log("Stopping Build because @{param1} @{condition} @{param2} is @{when} !!");
java.lang.System.exit(0);
// alternatively use
//project.fireBuildFinished(null);
}
</script>
</sequential>
</macrodef>
Esempi
<!-- compare int, default paramtype=math and when=true -->
<stopbuild param1="10" param2="11" condition="lt"/>
uscita:
[script] Stopping Build because 10 lt 11 is true !!
<!-- compare strings, default when=true -->
<stopbuild param1="abc" param2="abcd" paramtype="foo" condition="lt"/>
uscita:
[script] Stopping Build because abc lt abcd is true !!
Perché un task chiamato ** 'fail' ** fa qualcosa di diverso dal fail? –