Hi All,
I have found an interesting problem when one is defining their own task
and this
task is being defined within multiple build.xml files. The problem
happens when
you do the following.
1 - define a task using the taskdef within a top level build file and
supply a classpath
<taskdef name="foo" classpath="foo.jar" />
2 - use the ant task to run another build.xml file.
3 - define the same task within the new project using
the same/classpath information.
<taskdef name="foo" classpath="foo.jar" />
This process causes the following error:
Trying to override old definition of task osjcfp
BUILD FAILED
file:/os/dserve/java/build.xml:514: The <osjcfp> task doesn't support
the nested "persistCapable" element.
at
org.apache.tools.ant.IntrospectionHelper.createElement(IntrospectionHelper.java:521)
at
org.apache.tools.ant.UnknownElement.handleChildren(UnknownElement.java:239)
at
org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:122)
at org.apache.tools.ant.Task.getReplacement(Task.java:401)
at org.apache.tools.ant.Task.perform(Task.java:354)
at org.apache.tools.ant.Target.execute(Target.java:309)
at org.apache.tools.ant.Target.performTasks(Target.java:336)
at org.apache.tools.ant.Project.executeTarget(Project.java:1339)
at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:397)
at org.apache.tools.ant.Task.perform(Task.java:341)
at org.apache.tools.ant.Target.execute(Target.java:309)
at org.apache.tools.ant.Target.performTasks(Target.java:336)
at org.apache.tools.ant.Project.executeTarget(Project.java:1339)
at
org.apache.tools.ant.Project.executeTargets(Project.java:1255)
at org.apache.tools.ant.Main.runBuild(Main.java:609)
at org.apache.tools.ant.Main.start(Main.java:196)
at org.apache.tools.ant.Main.main(Main.java:235)
Total time: 41 seconds
NOTE: I do not get this exception if I try to create the same task
multiple
times within the same top level project. I only get the "Trying ..."
message
and I am also able to use the task. This only happens when I use the ant
task
and that build process creates a taskdef. Also, the ant task call I used
was simply
<ant dir="foo" target="compile" />
I was able to remove this problem by not adding the defined task to the
new project
that ant creates. I changed the Ant initializeProject method from:
Hashtable taskdefs = getProject().getTaskDefinitions();
Enumeration et = taskdefs.keys();
while (et.hasMoreElements()) {
String taskName = (String) et.nextElement();
if (taskName.equals("property")) {
// we have already added this taskdef in #init
continue;
}
Class taskClass = (Class) taskdefs.get(taskName);
newProject.addTaskDefinition(taskName, taskClass);
}
to:
Hashtable taskdefs = getProject().getTaskDefinitions();
Enumeration et = taskdefs.keys();
while (et.hasMoreElements()) {
String taskName = (String) et.nextElement();
if (taskName.equals("property")) {
// we have already added this taskdef in #init
continue;
}
Class taskClass = (Class) taskdefs.get(taskName);
Class newTaskClass = null;
try {
newTaskClass = Class.forName( taskClass.getName() );
} catch( ClassNotFoundException cnfe ) {
// This is no longer defined within this project.
continue;
}
newProject.addTaskDefinition(taskName, (newTaskClass ==
null) ? taskClass : newTaskClass);
}
I have tested this tested this solution and it works correctly. I also
wonder if
this will also be a problem with the DataTypeDefinitions that are
propagated to
the new projects?
Ant developers can you tell me if this is a bug or not?
If it is, is this solution that I offered useful?
thanks,
--Claudio