Author: bodewig
Date: Thu Jan  2 07:22:39 2014
New Revision: 1554758

URL: http://svn.apache.org/r1554758
Log:
deal more gracefully with non-JARs on the CLASSPATH - PR 53964

Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java
    ant/core/trunk/src/tests/antunit/taskdefs/optional/junit/junit-test.xml
    ant/core/trunk/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1554758&r1=1554757&r2=1554758&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Thu Jan  2 07:22:39 2014
@@ -40,6 +40,11 @@ Fixed bugs:
    explicitly disable caching to avoid problems with reloading jars.
    Bugzilla Report 54473
 
+ * AntClassloader will now ignore files that are part of the classpath but
+   not valid zip files when scanning for resources.  It used to throw
+   an exception.
+   Bugzilla Report 53964
+
 Other changes:
 --------------
 

Modified: ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java?rev=1554758&r1=1554757&r2=1554758&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/AntClassLoader.java Thu Jan  2 
07:22:39 2014
@@ -41,6 +41,7 @@ import java.util.jar.Attributes.Name;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
+import java.util.zip.ZipException;
 import org.apache.tools.ant.types.Path;
 import org.apache.tools.ant.util.CollectionUtils;
 import org.apache.tools.ant.util.FileUtils;
@@ -1003,7 +1004,19 @@ public class AntClassLoader extends Clas
             } else {
                 if (jarFile == null) {
                     if (file.exists()) {
-                        jarFile = new JarFile(file);
+                        try {
+                            jarFile = new JarFile(file);
+                        } catch (ZipException notAJar) {
+                            // raised if a file that is not a ZIP
+                            // happens to be part of the classpath -
+                            // this obviously cannot contain the
+                            // resource
+                            String msg = "CLASSPATH element " + file
+                                + " is not a JAR.";
+                            log(msg, Project.MSG_WARN);
+                            System.err.println(msg);
+                            return null;
+                        }
                         jarFiles.put(file, jarFile);
                     } else {
                         return null;

Modified: 
ant/core/trunk/src/tests/antunit/taskdefs/optional/junit/junit-test.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/optional/junit/junit-test.xml?rev=1554758&r1=1554757&r2=1554758&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/optional/junit/junit-test.xml 
(original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/optional/junit/junit-test.xml Thu 
Jan  2 07:22:39 2014
@@ -345,4 +345,24 @@ public class BTest extends TestCase {
       <test name="T2" methods="ok" />
     </junit>
   </target>
+
+  <target name="testClasspathBuildingSurvivesNonZips" depends="setUp"
+          
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=53964";>
+    <empty-test classname="ATest" package="org.apache.ant.test" />
+    <javac srcdir="${input}" destdir="${output}">
+      <classpath refid="junit" />
+    </javac>
+    <junit fork="true" printsummary="true" haltonerror="true">
+      <classpath>
+        <pathelement location="${output}" />
+        <pathelement location="${ant.file}" />
+        <path refid="junit" />
+      </classpath>
+      <batchtest>
+        <fileset dir="${output}">
+          <include name="**/*Test.class" />
+        </fileset>
+      </batchtest>
+    </junit>
+  </target>
 </project>

Modified: 
ant/core/trunk/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java?rev=1554758&r1=1554757&r2=1554758&view=diff
==============================================================================
--- ant/core/trunk/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java 
(original)
+++ ant/core/trunk/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java 
Thu Jan  2 07:22:39 2014
@@ -168,13 +168,13 @@ public class AntClassLoaderTest extends 
             System.setErr(err);
             loader.getResource("foo.txt");
             String log = getLog();
-            int startMessage = log.indexOf("Unable to obtain resource from ");
+            int startMessage = log.indexOf("CLASSPATH element ");
             assertTrue(startMessage >= 0);
-            assertTrue(log.indexOf("foo.jar", startMessage) > 0);
+            assertTrue(log.indexOf("foo.jar is not a JAR", startMessage) > 0);
             log = errBuffer.toString();
-            startMessage = log.indexOf("Unable to obtain resource from ");
+            startMessage = log.indexOf("CLASSPATH element ");
             assertTrue(startMessage >= 0);
-            assertTrue(log.indexOf("foo.jar", startMessage) > 0);
+            assertTrue(log.indexOf("foo.jar is not a JAR", startMessage) > 0);
         } finally {
             System.setErr(sysErr);
         }


Reply via email to