Ok well here is a patch to TldLocationsCache that should all Jasper to correctly process packaged tab libraries. I tested on my system and it works well. I changed processJars() to use the "getResourcePaths" method as Remy suggested. I pulled "tldConfigJar()" as it did a bunch of stuff with URL's that appeared to be overly complex. I put the logic from that method right in the "processJars()" and accessed the jar files directly (i.e. w/out a url or connection). I changed "parseTldForUri()" because it was looking for a child <taglib> and then a <uri> it should have just looked for a <uri> right off. Lastly I'm not sure why the diff produced some 'goofy' stuff. If somebody lets me know how to fix it I won't do it in the future. Really lastly - this is my first attempt at sending in a patch to an open source project so if somehow I've f'ed up the etiquette, then please be gentle. - Robert 4c4 < * Copyright (c) 1999 The Apache Software Foundation. All rights --- > * Copyright (c) 1999 The Apache Software Foundation. All rights 12c12 < * notice, this list of conditions and the following disclaimer. --- > * notice, this list of conditions and the following disclaimer. 20,21c20,21 < * any, must include the following acknowlegement: < * "This product includes software developed by the --- > * any, must include the following acknowlegement: > * "This product includes software developed by the 28c28 < * from this software without prior written permission. For written --- > * from this software without prior written permission. For written 54c54 < */ --- > */ 63a64,65 > import java.util.Set; > import java.util.Iterator; 82c84 < * --- > * 121c123 < --- > 188d189 < 190d190 < 200,212c200,221 < URL libURL = null; < try { < libURL = ctxt.getResource("/WEB-INF/lib"); < } catch (MalformedURLException e) {} < < if ((libURL != null) && "file".equals(libURL.getProtocol())) { < File libFile = new File(libURL.getFile()); < if (libFile.exists() && libFile.canRead() && < libFile.isDirectory()) { < String filenames[] = libFile.list(); < for (int i=0; i<filenames.length; i++) { < if (!filenames[i].endsWith(".jar")) continue; < tldConfigJar(ctxt, "/WEB-INF/lib/" + filenames[i]); --- > try > { > Set libSet = ctxt.getResourcePaths("/WEB-INF/lib"); > Iterator it = libSet.iterator(); > while( it.hasNext() ) > { > String resourcePath = (String) it.next(); > JarFile jarFile = new JarFile(ctxt.getRealPath(resourcePath)); > Enumeration enumJarEntries = jarFile.entries(); > while( enumJarEntries.hasMoreElements() ) > { > JarEntry jarEntry = (JarEntry) enumJarEntries.nextElement(); > String name = jarEntry.getName(); > if (!name.startsWith("META-INF/")) continue; > if (!name.endsWith(".tld")) continue; > InputStream stream = jarFile.getInputStream(jarEntry); > String uri = parseTldForUri(resourcePath, stream); > if (uri != null) > { > mappings.put(uri, > new String[]{resourcePath, name} ); > } 216c225,226 < } --- > catch (MalformedURLException e) {} > catch (IOException ioe) {} 218,272d227 < /** < * Process a TLD in the JAR file at the specified resource path < * (if there is one). Will update the URI mappings for all < * the .tld files found in the META-INF directory tree, if < * a <uri> element is defined in the TLD. < * < * @param resourcePath Context-relative resource path < */ < private void tldConfigJar(ServletContext ctxt, String resourcePath) < throws JasperException < { < JarFile jarFile = null; < InputStream stream = null; < try { < URL url = ctxt.getResource(resourcePath); < if (url == null) return; < url = new URL("jar:" + url.toString() + "!/"); < JarURLConnection conn = < (JarURLConnection) url.openConnection(); < jarFile = conn.getJarFile(); < Enumeration entries = jarFile.entries(); < while (entries.hasMoreElements()) { < JarEntry entry = (JarEntry) entries.nextElement(); < String name = entry.getName(); < if (!name.startsWith("META-INF/")) continue; < if (!name.endsWith(".tld")) continue; < //p("tldConfigJar(" + resourcePath + < // "): Processing entry '" + name + "'"); < stream = jarFile.getInputStream(entry); < String uri = parseTldForUri(resourcePath, stream); < //p("uri in TLD is: " + uri); < if (uri != null) { < mappings.put(uri, < new String[]{resourcePath, name}); < //p("added mapping: " + uri + < // " -> " + resourcePath + " " + name); < } < } < // FIXME @@@ < // -- it seems that the JarURLConnection class caches JarFile < // objects for particular URLs, and there is no way to get < // it to release the cached entry, so < // there's no way to redeploy from the same JAR file. Wierd. < } catch (Exception ex) { < if (stream != null) { < try { < stream.close(); < } catch (Throwable t) {} < } < if (jarFile != null) { < try { < jarFile.close(); < } catch (Throwable t) {} < } < } 275c230 < private String parseTldForUri(String resourcePath, InputStream in) --- > private String parseTldForUri(String resourcePath, InputStream in) 282,298c237,241 < Iterator taglibs = tld.findChildren("taglib"); < int n = 0; < while (taglibs.hasNext()) { < n++; < if (n > 1) { < Constants.message("jsp.error.more.than.one.taglib", < new Object[] {resourcePath}, < Logger.ERROR); < return null; < } < TreeNode taglib = (TreeNode) taglibs.next(); < TreeNode uri = taglib.findChild("uri"); < if (uri != null) { < String body = uri.getBody(); < if (body != null) < return body; < } --- > TreeNode uri = tld.findChild("uri"); > if (uri != null) { > String body = uri.getBody(); > if (body != null) > return body; 308c251 < * Get the 'location' of the TLD associated with --- > * Get the 'location' of the TLD associated with 310c253 < * --- > * 317,318c260,261 < * A tag library is 'exposed' either explicitely in < * web.xml or implicitely via the uri tag in the TLD --- > * A tag library is 'exposed' either explicitely in > * web.xml or implicitely via the uri tag in the TLD 321c264 < public String[] getLocation(String uri) --- > public String[] getLocation(String uri) 330c273 < /** --- > /** -----Original Message----- From: Remy Maucherat [mailto:[EMAIL PROTECTED]] Sent: Tuesday, May 22, 2001 9:42 AM To: [EMAIL PROTECTED] Subject: Re: Packaged tag libraries > Maybe I'm running a version that is too old (daily build from 5/12/2001) but > I cant find the method you sugest. What object is "getResourcePaths" on? ServletContext. Remy
4c4 < * Copyright (c) 1999 The Apache Software Foundation. All rights --- > * Copyright (c) 1999 The Apache Software Foundation. All rights 12c12 < * notice, this list of conditions and the following disclaimer. --- > * notice, this list of conditions and the following disclaimer. 20,21c20,21 < * any, must include the following acknowlegement: < * "This product includes software developed by the --- > * any, must include the following acknowlegement: > * "This product includes software developed by the 28c28 < * from this software without prior written permission. For written --- > * from this software without prior written permission. For written 54c54 < */ --- > */ 63a64,65 > import java.util.Set; > import java.util.Iterator; 82c84 < * --- > * 121c123 < --- > 188d189 < 190d190 < 200,212c200,221 < URL libURL = null; < try { < libURL = ctxt.getResource("/WEB-INF/lib"); < } catch (MalformedURLException e) {} < < if ((libURL != null) && "file".equals(libURL.getProtocol())) { < File libFile = new File(libURL.getFile()); < if (libFile.exists() && libFile.canRead() && < libFile.isDirectory()) { < String filenames[] = libFile.list(); < for (int i=0; i<filenames.length; i++) { < if (!filenames[i].endsWith(".jar")) continue; < tldConfigJar(ctxt, "/WEB-INF/lib/" + filenames[i]); --- > try > { > Set libSet = ctxt.getResourcePaths("/WEB-INF/lib"); > Iterator it = libSet.iterator(); > while( it.hasNext() ) > { > String resourcePath = (String) it.next(); > JarFile jarFile = new JarFile(ctxt.getRealPath(resourcePath)); > Enumeration enumJarEntries = jarFile.entries(); > while( enumJarEntries.hasMoreElements() ) > { > JarEntry jarEntry = (JarEntry) enumJarEntries.nextElement(); > String name = jarEntry.getName(); > if (!name.startsWith("META-INF/")) continue; > if (!name.endsWith(".tld")) continue; > InputStream stream = jarFile.getInputStream(jarEntry); > String uri = parseTldForUri(resourcePath, stream); > if (uri != null) > { > mappings.put(uri, > new String[]{resourcePath, name} ); > } 216c225,226 < } --- > catch (MalformedURLException e) {} > catch (IOException ioe) {} 218,272d227 < /** < * Process a TLD in the JAR file at the specified resource path < * (if there is one). Will update the URI mappings for all < * the .tld files found in the META-INF directory tree, if < * a <uri> element is defined in the TLD. < * < * @param resourcePath Context-relative resource path < */ < private void tldConfigJar(ServletContext ctxt, String resourcePath) < throws JasperException < { < JarFile jarFile = null; < InputStream stream = null; < try { < URL url = ctxt.getResource(resourcePath); < if (url == null) return; < url = new URL("jar:" + url.toString() + "!/"); < JarURLConnection conn = < (JarURLConnection) url.openConnection(); < jarFile = conn.getJarFile(); < Enumeration entries = jarFile.entries(); < while (entries.hasMoreElements()) { < JarEntry entry = (JarEntry) entries.nextElement(); < String name = entry.getName(); < if (!name.startsWith("META-INF/")) continue; < if (!name.endsWith(".tld")) continue; < //p("tldConfigJar(" + resourcePath + < // "): Processing entry '" + name + "'"); < stream = jarFile.getInputStream(entry); < String uri = parseTldForUri(resourcePath, stream); < //p("uri in TLD is: " + uri); < if (uri != null) { < mappings.put(uri, < new String[]{resourcePath, name}); < //p("added mapping: " + uri + < // " -> " + resourcePath + " " + name); < } < } < // FIXME @@@ < // -- it seems that the JarURLConnection class caches JarFile < // objects for particular URLs, and there is no way to get < // it to release the cached entry, so < // there's no way to redeploy from the same JAR file. Wierd. < } catch (Exception ex) { < if (stream != null) { < try { < stream.close(); < } catch (Throwable t) {} < } < if (jarFile != null) { < try { < jarFile.close(); < } catch (Throwable t) {} < } < } 275c230 < private String parseTldForUri(String resourcePath, InputStream in) --- > private String parseTldForUri(String resourcePath, InputStream in) 282,298c237,241 < Iterator taglibs = tld.findChildren("taglib"); < int n = 0; < while (taglibs.hasNext()) { < n++; < if (n > 1) { < Constants.message("jsp.error.more.than.one.taglib", < new Object[] {resourcePath}, < Logger.ERROR); < return null; < } < TreeNode taglib = (TreeNode) taglibs.next(); < TreeNode uri = taglib.findChild("uri"); < if (uri != null) { < String body = uri.getBody(); < if (body != null) < return body; < } --- > TreeNode uri = tld.findChild("uri"); > if (uri != null) { > String body = uri.getBody(); > if (body != null) > return body; 308c251 < * Get the 'location' of the TLD associated with --- > * Get the 'location' of the TLD associated with 310c253 < * --- > * 317,318c260,261 < * A tag library is 'exposed' either explicitely in < * web.xml or implicitely via the uri tag in the TLD --- > * A tag library is 'exposed' either explicitely in > * web.xml or implicitely via the uri tag in the TLD 321c264 < public String[] getLocation(String uri) --- > public String[] getLocation(String uri) 330c273 < /** --- > /**