users@glassfish.java.net

JARs in lib/applibs not available to JSP compiler?

From: <glassfish_at_javadesktop.org>
Date: Sun, 14 Sep 2008 11:46:29 PDT

Sun Java System Application Server 9.1_02 (build b04-fcs)

When deploying an EAR, jars specified in the --libraries parameter are visible to servlet classes, but not to the JSP compiler, causing NoClassDefFound exceptions and breaking the JSPs in the application. The only workaround I have found is to add a classloader extra-class-path attribute to the sun-web.xml before building the EAR. This couples the binding information inside the WAR, rather than keeping it as a 'pure' deployment fact.

Am I missing something? I've tried all 8 iterations of the following tests:

- Explicitly declare the JspServlet in my WAR/WEB-INF/web.xml - hoping that it will share a classloader with the rest of the application - no luck

- Specify --libraries more explicitly, using ${com.sun.aas.instanceRoot}/lib/applibs/someclasses.jar - no luck

In each of the above cases, the Jasper compiler lists its complete classpath, which does not include anything in /lib/applibs

The one case that does work is:

- Add the line
    <classloader extra-class-path="../../../../lib/applibs/someclasses.jar" />
to WEB-INF/sun-web.xml inside the WAR - this works, but is kind of gross. In the first place, the path is relative to the WAR's docroot, implying that classes are normally found within the WAR. There's already a J2EE standard way to reference resources that are contained in the WAR. In the second place, it requires the application to 'know' the folder structure of the container it's being deployed to, which injects container/version dependency.

Personally, I would rather see the --libraries classpath entries automatically passed to the JSP compiler. I fully expect to hear suggestions that I bundle the required JARs into the EAR, or include them in WAR/WEB-INF/lib, or X or Y or Z. I'll do that if absolutely necessary, but the real goal here is to simplify management of my JARs by placing them in a single repository within the instance, for all applications to share. Isn't that the intent of being able to provide library information during deployment?
[Message sent by forum member 'jpedwardsdotcom' (jpedwardsdotcom)]

http://forums.java.net/jive/thread.jspa?messageID=299262