diff --git a/build.xml b/build.xml
index 037fd5310..4f13081b7 100644
--- a/build.xml
+++ b/build.xml
@@ -1339,6 +1339,13 @@
+
+
+
+
+
+
+
diff --git a/src/etc/testcases/taskdefs/antlib.xml b/src/etc/testcases/taskdefs/antlib.xml
index cc41acadb..c9ac9863e 100644
--- a/src/etc/testcases/taskdefs/antlib.xml
+++ b/src/etc/testcases/taskdefs/antlib.xml
@@ -14,6 +14,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ -and-then-
+
+
+
diff --git a/src/etc/testcases/taskdefs/test2.antlib.xml b/src/etc/testcases/taskdefs/test2.antlib.xml
new file mode 100644
index 000000000..0e35817c6
--- /dev/null
+++ b/src/etc/testcases/taskdefs/test2.antlib.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/Definer.java b/src/main/org/apache/tools/ant/taskdefs/Definer.java
index ab16a160f..7ef02c422 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Definer.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Definer.java
@@ -60,6 +60,7 @@ import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.Locale;
+import java.util.NoSuchElementException;
import java.util.Properties;
import org.apache.tools.ant.AntTypeDefinition;
@@ -217,26 +218,40 @@ public abstract class Definer extends DefBase {
+ "together with file or resource.";
throw new BuildException(msg, getLocation());
}
- URL url = null;
+ Enumeration/**/ urls = null;
if (file != null) {
- url = fileToURL();
- }
- if (resource != null) {
- url = resourceToURL(al);
+ final URL url = fileToURL();
+ urls = new Enumeration() {
+ private boolean more = true;
+ public boolean hasMoreElements() {
+ return more;
+ }
+ public Object nextElement() throws NoSuchElementException {
+ if (more) {
+ more = false;
+ return url;
+ } else {
+ throw new NoSuchElementException();
+ }
+ }
+ };
+ } else {
+ urls = resourceToURLs(al);
}
- if (url == null) {
- return;
- }
+ while (urls.hasMoreElements()) {
+ URL url = (URL) urls.nextElement();
- if (url.toString().toLowerCase(Locale.US).endsWith(".xml")) {
- format = Format.XML;
- }
+ int format = this.format;
+ if (url.toString().toLowerCase(Locale.US).endsWith(".xml")) {
+ format = Format.XML;
+ }
- if (format == Format.PROPERTIES) {
- loadProperties(al, url);
- } else {
- loadAntlib(al, url);
+ if (format == Format.PROPERTIES) {
+ loadProperties(al, url);
+ } else {
+ loadAntlib(al, url);
+ }
}
}
}
@@ -259,9 +274,16 @@ public abstract class Definer extends DefBase {
}
}
- private URL resourceToURL(ClassLoader classLoader) {
- URL ret = classLoader.getResource(resource);
- if (ret == null) {
+ private Enumeration/**/ resourceToURLs(ClassLoader classLoader) {
+ Enumeration ret;
+ try {
+ ret = classLoader.getResources(resource);
+ } catch (IOException e) {
+ throw new BuildException(
+ "Could not fetch resources named " + resource,
+ e, getLocation());
+ }
+ if (!ret.hasMoreElements()) {
if (onError != OnError.IGNORE) {
log("Could not load definitions from resource "
+ resource + ". It could not be found.",
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java b/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java
index 0679ead52..51b4199bb 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java
@@ -73,6 +73,15 @@ public class AntlibTest extends BuildFileTest {
public void testAntlibFile() {
expectLog("antlib.file", "MyTask called");
}
+
+ /**
+ * Confirms that all matching resources will be used, so that you
+ * can collect several antlibs in one Definer call.
+ * @see "http://issues.apache.org/bugzilla/show_bug.cgi?id=24024"
+ */
+ public void testAntlibResource() {
+ expectLog("antlib.resource", "MyTask called-and-then-MyTask2 called");
+ }
public void testNsCurrent() {
expectLog("ns.current", "Echo2 inside a macroHello from x:p");
@@ -84,5 +93,11 @@ public class AntlibTest extends BuildFileTest {
}
}
+ public static class MyTask2 extends Task {
+ public void execute() {
+ log("MyTask2 called");
+ }
+ }
+
}