Isolates Jetty's WebAppClassLoader to enforce that the user must supply server-side libraries into WEB-INF/lib. git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4518 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java b/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java index 58ed521..1b6023a 100644 --- a/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java +++ b/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java
@@ -23,6 +23,7 @@ import org.mortbay.jetty.Server; import org.mortbay.jetty.nio.SelectChannelConnector; +import org.mortbay.jetty.webapp.WebAppClassLoader; import org.mortbay.jetty.webapp.WebAppContext; import org.mortbay.log.Log; import org.mortbay.log.Logger; @@ -132,13 +133,40 @@ } } + /** + * Ensures that only Jetty and other server classes can be loaded into the web + * app classloader. This forces the user to put any necessary dependencies + * into WEB-INF/lib. + */ + private static final class FilteringParentClassLoader extends ClassLoader { + private WebAppClassLoader child = null; + private final ClassLoader delegateTo = Thread.currentThread().getContextClassLoader(); + + private FilteringParentClassLoader() { + super(null); + } + + public void setChild(WebAppClassLoader child) { + this.child = child; + } + + @Override + protected Class<?> findClass(String name) throws ClassNotFoundException { + if (child != null + && (child.isServerPath(name) || child.isSystemPath(name))) { + return delegateTo.loadClass(name); + } + throw new ClassNotFoundException(); + } + } + private static class JettyServletContainer extends ServletContainer { private final int actualPort; private final File appRootDir; private final TreeLogger logger; - private final WebAppContext wac; private final Server server; + private final WebAppContext wac; public JettyServletContainer(TreeLogger logger, Server server, WebAppContext wac, int actualPort, File appRootDir) { @@ -222,6 +250,10 @@ // Create a new web app in the war directory. WebAppContext wac = new WebAppContext(appRootDir.getAbsolutePath(), "/"); + FilteringParentClassLoader parentClassLoader = new FilteringParentClassLoader(); + WebAppClassLoader wacl = new WebAppClassLoader(parentClassLoader, wac); + parentClassLoader.setChild(wacl); + wac.setClassLoader(wacl); // Prevent file locking on Windows; pick up file changes. wac.getInitParams().put(