mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-09-03 04:26:12 +08:00
Make TomcatEmbeddedWebappClassLoader parallel capable
Closes gh-10477
This commit is contained in:
parent
027c5a0e35
commit
77cbab794e
@ -21,24 +21,28 @@ import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
|
||||
import org.apache.catalina.loader.WebappClassLoader;
|
||||
import org.apache.catalina.loader.ParallelWebappClassLoader;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Extension of Tomcat's {@link WebappClassLoader} that does not consider the
|
||||
* Extension of Tomcat's {@link ParallelWebappClassLoader} that does not consider the
|
||||
* {@link ClassLoader#getSystemClassLoader() system classloader}. This is required to
|
||||
* ensure that any custom context classloader is always used (as is the case with some
|
||||
* ensure that any custom context class loader is always used (as is the case with some
|
||||
* executable archives).
|
||||
*
|
||||
* @author Phillip Webb
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public class TomcatEmbeddedWebappClassLoader extends WebappClassLoader {
|
||||
public class TomcatEmbeddedWebappClassLoader extends ParallelWebappClassLoader {
|
||||
|
||||
private static final Log logger = LogFactory
|
||||
.getLog(TomcatEmbeddedWebappClassLoader.class);
|
||||
|
||||
static {
|
||||
ClassLoader.registerAsParallelCapable();
|
||||
}
|
||||
|
||||
public TomcatEmbeddedWebappClassLoader() {
|
||||
super();
|
||||
}
|
||||
@ -58,14 +62,16 @@ public class TomcatEmbeddedWebappClassLoader extends WebappClassLoader {
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Class<?> loadClass(String name, boolean resolve)
|
||||
public Class<?> loadClass(String name, boolean resolve)
|
||||
throws ClassNotFoundException {
|
||||
Class<?> result = findExistingLoadedClass(name);
|
||||
result = (result == null ? doLoadClass(name) : result);
|
||||
if (result == null) {
|
||||
throw new ClassNotFoundException(name);
|
||||
synchronized (getClassLoadingLock(name)) {
|
||||
Class<?> result = findExistingLoadedClass(name);
|
||||
result = (result == null ? doLoadClass(name) : result);
|
||||
if (result == null) {
|
||||
throw new ClassNotFoundException(name);
|
||||
}
|
||||
return resolveIfNecessary(result, resolve);
|
||||
}
|
||||
return resolveIfNecessary(result, resolve);
|
||||
}
|
||||
|
||||
private Class<?> findExistingLoadedClass(String name) {
|
||||
|
@ -28,7 +28,7 @@ import java.util.jar.JarOutputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
|
||||
import org.apache.catalina.core.StandardContext;
|
||||
import org.apache.catalina.loader.WebappClassLoader;
|
||||
import org.apache.catalina.loader.ParallelWebappClassLoader;
|
||||
import org.apache.catalina.webresources.StandardRoot;
|
||||
import org.apache.catalina.webresources.WarResourceSet;
|
||||
import org.junit.Rule;
|
||||
@ -73,7 +73,7 @@ public class TomcatEmbeddedWebappClassLoaderTests {
|
||||
throws Exception {
|
||||
URLClassLoader parent = new URLClassLoader(
|
||||
new URL[] { new URL(webInfClassesUrlString(war)) }, null);
|
||||
try (WebappClassLoader classLoader = new TomcatEmbeddedWebappClassLoader(
|
||||
try (ParallelWebappClassLoader classLoader = new TomcatEmbeddedWebappClassLoader(
|
||||
parent)) {
|
||||
StandardContext context = new StandardContext();
|
||||
context.setName("test");
|
||||
|
Loading…
Reference in New Issue
Block a user