Created attachment 26078 [details] test build We discovered an issue when a project directory containing a "!" was used with Ant upgraded to version 1.8.1. My initial hunch is that Ant is converting this file path to a URI and then the ! is being misinterpreted as a separator for the jar URL scheme, even though "jar:" was nowhere to be seen. As the variable in question comes from one of Ant's own tasks, one would expect it to work when used as part of the parameter for another task, and indeed, the issue does not occur on version 1.7.0. I zipped up a minimal build directory which reproduces the issue, at least on Windows. G:\!test>ant Buildfile: G:\!test\build.xml BUILD FAILED G:\!test\build.xml:3: The following error occurred while executing this line: java.io.FileNotFoundException: G:\ (The filename, directory name, or volume label syntax is incorrect) at java.io.RandomAccessFile.open(Native Method) at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212) at org.apache.tools.zip.ZipFile.<init>(ZipFile.java:182) at org.apache.tools.zip.ZipFile.<init>(ZipFile.java:148) at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:274) at org.apache.tools.ant.helper.ProjectHelper2.parseUnknownElement(ProjectHelper2.java:130) at org.apache.tools.ant.helper.ProjectHelper2.parseAntlibDescriptor(ProjectHelper2.java:110) at org.apache.tools.ant.taskdefs.Antlib.createAntlib(Antlib.java:91) at org.apache.tools.ant.taskdefs.Definer.loadAntlib(Definer.java:440) at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:292) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:390) at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:179) at org.apache.tools.ant.ProjectHelper.configureProject(ProjectHelper.java:82) at org.apache.tools.ant.Main.runBuild(Main.java:786) at org.apache.tools.ant.Main.startAnt(Main.java:218) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) Total time: 0 seconds
Well, there is a jar: protocol in view. The error you see is when Ant tries to read the antlib.xml from ant-contrib.jar and its URL will be something like jar:file:///!temp/lib/ant-contrib.jar!net/sf/antcontrib/antlib.xml Using lastIndexOf("!") instead of indexOf("!") would help in this case but I need to think through the possible code paths first to convince myself that no "!" could ever appear after the ! inside the JAR protocol.
svn revision 1001756 fixes this as long as the ! is not at the end of the directory name. In the later case JarURLConnection.connect() fails for an URL returned by Classloader.getResources() - I'm not convinced there is anything we can do for this case, but I'm keeping the issue open in case anybody has a good idea.
Aha, the hidden JAR URL. :) There is some talk of this on a Sun bug record too. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4730642 The suggestion someone gives there is only to match the ! if it's actually after .jar so that it won't match a bare directory. I guess it won't match .zip which could technically contain classes too, but IMO it's not a jar file unless it ends in .jar anyway, so it would seem like it would just encourage people not to do things in a strange way. What perplexes me is that Ant 1.7.0 didn't have the issue. I am guessing it wasn't using URLs?