Stefan, thank you for two excellent solutions. I actually implemented the reference solution yesterday. What I discovered would be interesting for others looking for a solution like this:
* Project.addReference() is what I used to create and set a new reference at the highest Project level. * You must ensure that inheritRefs="true" is set for any nested antcall,ant,subant,runtarget tasks in the entire task call chain that will invoke the task that you wish to cache data for. * You must look out for 'cloning' of the references along the task chain. The Ant code implicitly calls 'clone' via reflection, which can block your attempts to retrieve the cached data at the original project scope if the data structure used to hold the cached information creates new instances of itself (for example when using a HashMap to cache data, I had to subclass it and overwrite 'clone()' to return 'this'). That being said, I think recycling the class loader is a more concise and and accurate solution in my case. Since my build file re-executes the taskdefs, I would need to use the loaderRef as Stefan mentioned to prevent the class from being reloaded on a subsequent execution. Thanks again! On Thu, Sep 27, 2012 at 9:08 PM, Stefan Bodewig <bode...@apache.org> wrote: > On 2012-09-26, Jose Rojas wrote: > > > I would like to create a custom ant task that caches some results from an > > operation and saves it for use in future executions. My simple method of > > doing this is using a 'static' member. This would work great for me as > the > > operations would be appropriate to cache at an application wide level. > > A better approach might be to store the data as a reference in the > Project instance (or several of them). > > > However what I'm noticing is that for each new execution of Ant (I'm > using > > the Ant taskdef to execute ant), the static data is lost, quite possibly > > caused by Ant creating a new class loader upon every execution, thus not > > reusing my ant task class instance from the previous execution. > > This would happen if you use multiple taskdefs - i.e. repeat it several > times. You can pass a name of a class loader to taskdef (the loaderRef > attribute) and Ant will create a class loader on the first execution, > cache it and reuse it for all subsequent task/typedefs that use the same > name. > > Stefan > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@ant.apache.org > For additional commands, e-mail: user-h...@ant.apache.org > >