The ProjectHelper
in Apache Ant is responsible for parsing the build file
and creating Java instances representing the build workflow. It also signals which kind of file it
can parse, and which file name it expects as default input file.
Ant's default ProjectHelper
(org.apache.tools.ant.helper.ProjectHelper2
) parses the
usual build.xml
files. And if no build file is specified on the command line, it will
expect to find a file named build.xml
.
The immediate benefit of a such abstraction it that it is possible to make Ant understand other kind of descriptive languages than XML. Some experiments have been done around a pure Java frontend, and a Groovy one too (ask the dev mailing list for further info about these).
Since Ant 1.8.2, the import task will also try to use the proper helper to parse the imported file. So it is possible to write different build files in different languages and have them import each other.
Ant knows about several implementations of ProjectHelper
and has to decide
which to use for each build file.
At startup Ant lists the all implementations found and keeps them in the same order they've been found in an internal 'repository':
org.apache.tools.ant.ProjectHelper
(see Java System Properties);ProjectHelper
service declarations
in the META-INF: it searches in the classpath for a
file META-INF/services/org.apache.tools.ant.ProjectHelper. This file will just
contain the fully qualified name of the implementation
of ProjectHelper
to instantiate;ProjectHelper
service declarations in the META-INF;ProjectHelper
that can
parse classical build.xml files.
In case of an error while trying to instantiate a ProjectHelper
, Ant will
log an error but won't stop. If you want further debugging info about
the ProjectHelper
internal 'repository', use the system
property ant.project-helper-repo.debug
and set it to true
; the full stack trace
will then also be printed.
When Ant is expected to parse a file, it will ask the ProjectHelper
repository to find an implementation that will be able to parse the input file. Actually it will
just iterate over the ordered list and the first implementation that returns true
to supportsBuildFile(File buildFile)
will be selected.
When Ant is started and no input file has been specified, it will search for a default input
file. It will iterate over list of ProjectHelper
s and will select the
first one that expects a default file that actually exist.
The class org.apache.tools.ant.ProjectHelper
is the API expected to be
implemented. So write your own ProjectHelper
by extending that abstract
class. You are then expected to implement at least the function parse(Project
project, Object source)
. Note also that your implementation will be instantiated by Ant, and
it is expecting a default constructor with no arguments.
There are some functions that will help you define what your helper is capable of and what is is expecting:
getDefaultBuildFile()
: defines which file name is expected if none
providedsupportsBuildFile(File buildFile)
: defines if your parser can parse
the input filecanParseAntlibDescriptor(URL url)
: whether your implementation is
capable of parsing a given Antlib descriptor. The base class returns false
parseAntlibDescriptor(Project containingProject, URL source)
:
invoked to actually parse the Antlib descriptor if your implementation returned truefor the previous method.
Now that you have your implementation ready, you have to declare it to Ant. Three solutions here:
org.apache.tools.ant.ProjectHelper
(see also
the Java System Properties);