Не пытайтесь разрешить класс во время выполнения.
Это означает, что если вы просто используете класс, в минуту, когда он загружен, он зафиксирован в том, что является текущим контекстным загрузчиком классов. Будьте внимательны к этому.
А еще лучше, используйте строки или пакеты, всегда здесь.
Использование класса в привязке напрямую связывает класс с неправильным системным загрузчиком классов.
Пример из jetty-webapp-logging
(для записи всех журналов на уровне сервера).
public class CentralizedWebAppLoggingBinding implements AppLifeCycle.Binding
{
public String[] getBindingTargets()
{
return new String[]
{ "deploying" };
}
public void processBinding(Node node, App app) throws Exception
{
ContextHandler handler = app.getContextHandler();
if (handler == null)
{
throw new NullPointerException("No Handler created for App: " + app);
}
if (handler instanceof WebAppContext)
{
WebAppContext webapp = (WebAppContext)handler;
// Older API
webapp.addSystemClass("org.apache.log4j.");
webapp.addSystemClass("org.slf4j.");
webapp.addSystemClass("org.apache.commons.logging.");
}
}
}
В качестве альтернативы вы можете получить доступ к Классу с точки зрения WebApp, это также обеспечит нормальную работу вашего ClasspathPattern.
package jetty.deploy;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.thread.ThreadClassLoaderScope;
import org.eclipse.jetty.webapp.ClasspathPattern;
import org.eclipse.jetty.webapp.WebAppContext;
public class ExampleClassLoaderBinding implements AppLifeCycle.Binding
{
@Override
public String[] getBindingTargets()
{
return new String[]{AppLifeCycle.DEPLOYING};
}
@Override
public void processBinding(Node node, App app) throws Exception
{
ContextHandler handler = app.getContextHandler();
if (handler == null)
{
throw new NullPointerException("No Handler created for App: " + app);
}
if (handler instanceof WebAppContext)
{
WebAppContext webapp = (WebAppContext) handler;
try (ThreadClassLoaderScope scope = new ThreadClassLoaderScope(webapp.getClassLoader()))
{
// Demonstration of newer API
ClasspathPattern systemClasspathPattern = webapp.getSystemClasspathPattern();
systemClasspathPattern.add("org.apache.log4j.");
systemClasspathPattern.add("org.slf4j.");
systemClasspathPattern.add("org.apache.commons.logging.");
// Example of accessing class via WebApp scope
Class<?> clazz = Class.forName("com.corp.MyClass", true, scope.getScopedClassLoader());
Object obj = clazz.getDeclaredConstructor().newInstance();
}
}
}
}