It would be nice to have possibility to check version of Ant in build.xml script (that is needed when there is uneducated customer which is ignoring requirements of ant/java versions described in document - so we have to put 'fail' in ant script to stop doing stupid thing by the customer) Currently there are used too tricks (what I found): - based on checking if pointed class exists (like MacroDef from 1.6); - using contains + ${ant.version} But both have cause (or can) some problems, for example class can be moved in future versions. Below is small proposal of checkVersion task: <checkVersion name="ant.version.number" value="- + = += -=(means less greater equal, greater equal) version here, i.e. +=1.6.1" property="property name to set when condition not met"/> Idea is that it can be used for any version checking which follows standard pattern: number.number.number. Additional needed extension is 'ant.version.number' which returns just the number.
Would indeed be useful. Should probably be a condition, e.g. <fail message="Sorry, this script requires Ant 1.7+."> <condition> <not> <antversion atleast="1.7"/> </not> </condition> </fail> Here the proposed condition would just support two (mutually exclusive) attrs, 'atleast' and 'exactly', with 'atleast' doing a lexicographic-numeric check I guess.
Not the "cleanest" way, but I wrote two *def´s for handling with that: <project name="common-define-checkAnt"> <scriptdef name="checkAnt" language="javascript"> <![CDATA[ importClass(java.text.SimpleDateFormat); importClass(java.util.Locale); // String evaluation of 'ant.version' string // e.g: 'Apache Ant version 1.6beta3 compiled on December 5 2003' string = project.getProperty("ant.version"); version = string.substring(string.indexOf("Ant version")+12, string.indexOf("compiled on")-1); compiled = string.substring(string.indexOf("compiled on")+12); // Get the compiled date: 'December 5 2003' dateParser = new SimpleDateFormat("MMM d yyyy", Locale.US); compiledDate = dateParser.parse(compiled); compiledYear = (new SimpleDateFormat("yyyy")).format(compiledDate); compiledMonth = (new SimpleDateFormat("M") ).format(compiledDate); compiledDay = (new SimpleDateFormat("d") ).format(compiledDate); project.setNewProperty("ant.version.number", version); project.setNewProperty("ant.version.compiled", compiled); project.setNewProperty("ant.version.compiled.year", compiledYear); project.setNewProperty("ant.version.compiled.month", compiledMonth); project.setNewProperty("ant.version.compiled.day", compiledDay); ]]> </scriptdef> </project> <project name="common-define-needAnt"> <scriptdef name="needAnt" language="javascript"> <attribute name="version"/> <![CDATA[ needed = attributes.get("version"); string = project.getProperty("ant.version"); actual = string.substring(string.indexOf("Ant version")+12, string.indexOf("compiled on")-1); neededInt = getInt(needed); actualInt = getInt(actual); verbose("Needed: " + needed + " --> " + neededInt); verbose("Actual: " + actual + " --> " + actualInt); check = false; if (actualInt >= neededInt) check = true; if (!check) { java.lang.System.out.println(" -- abbruch --"); fail = project.createTask("fail"); fail.setMessage("Needed Ant-Version (" + needed + ") not available. Was: " + actual); fail.perform(); } // convert the version string to int value for easier comparison function getInt(string) { if (string.equals("1.1")) return 11; if (string.equals("1.2")) return 12; if (string.equals("1.3")) return 13; if (string.equals("1.4")) return 14; if (string.equals("1.4.1")) return 14.1; if (string.equals("1.5")) return 15; if (string.equals("1.5.1")) return 15.1; if (string.equals("1.5.2")) return 15.2; if (string.equals("1.5.3")) return 15.3; if (string.equals("1.5.4")) return 15.4; if (string.equals("1.5alpha")) return 15.880; if (string.equals("1.6beta1")) return 15.991; if (string.equals("1.6beta2")) return 15.992; if (string.equals("1.6beta3")) return 15.993; if (string.equals("1.6")) return 16; if (string.equals("1.6.0") ) return 16; if (string.equals("1.6.1") ) return 16.1; if (string.equals("1.6.2") ) return 16.2; if (string.equals("1.6.3") ) return 16.3; if (string.equals("1.7alpha")) return 16.880; if (string.equals("1.7beta")) return 16.990; if (string.equals("1.7")) return 17; if (string.equals("1.7.0")) return 17; if (string.equals("1.7.1")) return 17.1; if (string.equals("1.7.2")) return 17.2; return 0; } // log-message function verbose(msg) { project.log("[needAnt] " + msg, project.MSG_VERBOSE); } ]]> </scriptdef> </project>
So this is now FIXED with target milestone 1.7, right? Needs mention in WHATSNEW I guess. Unfortunate that you can't use this condition in any pre-1.7 scripts, which means it will only really be useful far into the future when 1.6.5 is a distant memory.
It is in ant 1.7, I have added a manual entry for it.
Seems to work: <fail message="too old"> <condition> <not> <antversion atleast="1.7.0"/> </not> </condition> </fail> Ant 1.6.5 fails, although with an unhelpful message: Class org.apache.tools.ant.taskdefs.condition.Not doesn't support the nested "antversion" element.