Hi, I'm porting a large project, with hundreds of makefiles, from GNU make to Ant. Today our makefiles include most of their functionality from "template" files, which is great for maintenance. I'm trying to implement the same functionality in Ant, and it seems that only two ways are currently available: 1) Delegating the common functionality to a "common" build.xml file, using the Ant task. Pros: - you can set the location of the common build.xml file using properties - it is a self-contained file, so it is easier to validate (test) Cons: - not trivial to customize. You can pass properties but can't pass a reference to a classpath. - Ant parses the whole referenced file for each delegated command.
2) Using external XML entities Pros - the file is parsed only once, at XML parse time - supports properties and references Cons - you have to import XML fragments - you have to specify the path to the include file as a relative reference to the current build.xml location. So I decided to use number 2, but having to hardcode relative paths really sucks, specially for large project trees with many levels of indirection. I took a look at Crimson, the XML parser used by Ant, and it does have an API for catalogs. It would be great if Ant could be extended to use it, because it would eliminate the issue of the hardcoded relative paths. For example, instead of: <!DOCTYPE project [ <!ENTITY common SYSTEM "file:./../../../../common.xml"> ]> We would be able to use: <!ENTITY common PUBLIC "-//mycompany//loadbuild-common-code//EN" "common.xml"> The PUBLIC name could be used to obtain the URI from a catalog provided to Ant at launch time - no need to specify a relative location. Ant would just have to expose the Crimson APIs that allow the user to register mappings for public names (i.e. the XML catalog); for example, passing a file in the command line or specifying it in an environment varianle (ANT_CATALOG?). This is the method I'm talking about, from class org.apache.crimson.parser.Resolver: /** * Registers the given public ID as corresponding to a particular * URI, typically a local copy. This URI will be used in preference * to ones provided as system IDs in XML entity declarations. This * mechanism would most typically be used for Document Type Definitions * (DTDs), where the public IDs are formally managed and versioned. * * @param publicId The managed public ID being mapped * @param uri The URI of the preferred copy of that entity */ public void registerCatalogEntry (