如何从 TestNG 模块获取 Web 应用程序类加载器?

问题描述 投票:0回答:1

Jetty下运行的MyServerClass使用Logback classic:

Logger logger = (Logger) LoggerFactory.getLogger(MyServerClass.class);`

在 TestNG 和 Selenium Webdriver 的单独 Maven 模块中,我尝试将 logback LoggerContextListener 附加到该记录器。

Logger logger = (Logger) LoggerFactory.getLogger(MyServerClass.class);
LoggerContext loggerContext = logger.getLoggerContext();
loggerContext.addListener(new MyLoggerContextListener());

问题是两个模块的类加载器不同 所以 LoggerFactory.getLogger(MyServerClass.class) 返回一个不同的实例 到在服务器模块和 MyServerClass.logger 中运行的程序,所以在 MyServerClass

loggerContext.getCopyOfListenerList();

仍然是空的。

在服务器模块中:

ServletContext servletContext = request.getServletContext();
String path = servletContext.getContextPath();

path 是一个空字符串,这意味着它是“根”上下文,植根于 Web 服务器的 URL 名称空间的基础。

在测试模块中: 我在某处读到,Jetty 提供了 ServletContextHelper,它可以返回 webAppClassLoader,它应该能够提供 Jetty 的 MyServerClass 实例,可以将侦听器添加到其中:

ServletContext servletContext = ServletContextHelper.getServletContext(path);
ClassLoader webAppClassLoader = servletContext.getClassLoader();
Class<?> MyServerClass = webAppClassLoader.loadClass("com.example.MyServerClass");
Logger logger = (Logger) LoggerFactory.getLogger(MyServerClass.class);
LoggerContext loggerContext = logger.getLoggerContext();
loggerContext.addListener(new MyLoggerContextListener());

我在 Jetty jar 中找不到这个 ServletContextHelper。 任何建议表示赞赏。

selenium-webdriver jetty classloader logback
1个回答
0
投票

在 Jetty 12 中,只需使用

addHiddenClassMatcher()
上的
WebAppContext

import org.eclipse.jetty.ee10.webapp.WebAppContext;
import org.eclipse.jetty.util.ClassMatcher;

WebAppContext webapp = new WebAppContext();
// other init of webapp
webapp.addHiddenClassMatcher(new ClassMatcher("ch.qos.logback"));
© www.soinside.com 2019 - 2024. All rights reserved.