> From: Christopher Schultz [mailto:[email protected]]
> Subject: Re: How to hot swap classes?
>
> Did you mean "a separate ClassLoader for all the JSPs"?
Not quite, but what I said was incomplete. From looking at the code, it
appears that each context gets its own instance of JasperLoader (a subclass of
URLClassLoader) when the first JSP for the context is referenced. That
classloader will continue to be used until a previously compiled but now
updated JSP is encountered. At that point, the existing JasperLoader for the
context is discarded, and a new one created. The following code is in
JspCompilationContext.java, at line 580 in 6.0.18:
public void compile() throws JasperException, FileNotFoundException {
createCompiler();
if (jspCompiler.isOutDated()) {
try {
jspCompiler.removeGeneratedFiles();
jspLoader = null;
jspCompiler.compile();
jsw.setReload(true);
jsw.setCompilationException(null);
} catch (JasperException ex) {
// Cache compilation exception
jsw.setCompilationException(ex);
throw ex;
} catch (Exception ex) {
JasperException je = new JasperException(
Localizer.getMessage("jsp.error.unable.compile"),
ex);
// Cache compilation exception
jsw.setCompilationException(je);
throw je;
}
}
}
The new instance of JasperLoader is created by the method getJspLoader() at
line 177 of the same file. Note that your grep would not have found the
JasperLoader due to its not using ClassLoader in its name.
Also, the JSP classloaders do not seem to appear in any JMX objects,
unfortunately.
- Chuck
THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY
MATERIAL and is thus for use only by the intended recipient. If you received
this in error, please contact the sender and delete the e-mail and its
attachments from all computers.