I'm developing a few custom ant tasks that all need to initialize the same objects. I wanted to initialize those object's in a common superclass that extends from Task, in the init() method. But I see from the lifecycle of an ant task that init() gets called before the tasks child elements and attributes are set. So all of the data I need for initializing those objects is unavailable during init(), if I am reading right.
So, why is init() called at this point? What do you even know that you could use in init()? What could it be used for?
(And is there some other method that I can rely on to be called before execute(), but after my data is available?)
Ant tasks are the units of your Ant build script that actually execute the build operations for your project. Ant tasks are usually embedded inside Ant targets. Thus, when you tell Ant to run a specific target it runs all Ant tasks nested inside that target.
**\*.sql means "in the given directory and inside all of its subdirectories, all the files that end with .sql"
The usetimestamp option enables you to control downloads so that the remote file is only fetched if newer than the local copy. If there is no local copy, the download always takes place. When a file is downloaded, the timestamp of the downloaded file is set to the remote timestamp.
The best guide to this is to look at the source code of the tasks that Ant ships with. There seems to be 3 main use cases for init()
:
Sync
task delegates most of its work to an underlying object, passing through some of the setXYZ()
to this delegate. The instantiation and pre-configuration of this delegate has to happen before any properties are set on the task.SSH
task initializes its knownHosts
default by looking at a System property. Also, the Project
object has been injected into the task by the init()
is called, so the task can look at that.All of the above could conceivably be done inside the task constructor, but the use of an explicit init()
method is in keeping with the Ant task design.
As for the second part of your question, no, there is no lifecycle hook that gets called between the properties being set, and execute()
being called. You have to do that inside execute()
itself.
The init() method is called on each Task upon parsing of the build file and also after the Task has been bound to its owning project. So the Task can do work that involves a Project
instance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With