Looking for a task that verifies the existance of a class on the system, I
found the 'available' task doing *almost* what I needed. The missing feature
was to stop the build if the class was not available.
Using only the existing features of task 'available', this lead to code like:
<target name="require-mylogger"
depends="check-mylogger,need-mylogger,need-log4j" />
<target name="check-mylogger">
<available property="mylogger" classname="mylogger.Logger" />
<available property="log4j" classname="org.log4j.Category" />
</target>
<target name="need-mylogger" unless="mylogger">
<fail message="Required 'mylogger' not found" />
</target>
<target name="need-log4j" unless="log4j">
<fail message="Required 'log4j' not found" />
</target>
All this just to stop the build if one of the required packages was not
available.
What I really want to do is something like
<require classname="mylogger.Logger" />
<require classname="org.log4j.Category" />
and get a BuildException when the class is not available on the classpath. I
know I
can specify the classpath in the build script, but that does not verify the real
availability of the classes.
I see three options, my question is which one to select:
1) Live with the existing features, but this leads to complex code for a very
simple
requirement when the number of classes needed grows.
2) Develop a task called 'require' that does exactly what I want. Easy, but
99.9% of the
code exists already in the 'available' task. This leads to:
<require classname="mylogger.Logger" />
3) Add a boolean attribute 'required' to the existing 'available' task, false
by default
to be backward compatible. Easy, but not my code to change. This leads to:
<available property="mylogger" classname="mylogger.Logger"
required="true" />
I don't like the first, the second means I would be stealing code from
'available', the
third I like most, keeping the number of almost similar tasks to a minimum, but
is this
useful and/or acceptable to others (the original developer, for example) ?
Please advise on the way to go in this and similar cases where a bit more
functionality
could make existing code more useful, although the audience for the feature may
be limited.