【发布时间】:2017-12-01 15:13:09
【问题描述】:
我们最近将项目转换为更加模块化。
我们使用 selenium 和 jbrowserdriver 从页面中抓取数据。
我们正在使用 Spring Boot 和 Tomcat。
以前,我们有一个单一的 war 文件,我们将其部署到 tomcat 并打包了所有的类文件。我们在会话期间使用带有线路日志的 jbrowserdriver 来捕获标头,并且效果很好。
但是,我们现在已经分离了一些功能,并且似乎我们在 tomcat 中遇到了不同的类加载器问题。
我们的系统布局如下:
/companyDir
+ -- /libs
| + -- core.jar
| + -- /widgets
| | + -- widgetA.jar
| | + -- widgetB.jar
Tomcat 配置为在其 shared.loader 属性中包含 /libs/*.jar 和 /libs/widgets/*.jar。这些 jar 文件包含在 tomcat 启动中。
然后我们部署一个包含 Spring 依赖项和控制器端点的文件 project.war。
但是,现在当我们调用端点并且端点执行 widgetA.jar 时,线路日志完全是空的。我们在 catalina.out 中看到了线路日志,但调用 driver.manage().logs().get("wire") 显示为空。我不确定如何配置它,以便我们的 webdriver 中的内部日志充满我们显然要返回的线路日志。
我可能只是对类加载器问题感到模糊,因为这似乎是问题所在。
【问题讨论】:
-
如此深入的挖掘表明,线路日志仍在由 org.apache.http 生成,但是当
LogsServer.java执行updateSettings()以重定向/重新路由org.apache.commons.logging.Log到com.machinepublishers.jbrowserdriver.WireLog时,这不是当所有类都从同一个类加载器执行时一样工作。由于 jbrowserdriver 使用 RMI 执行它,我很难理解它是如何正常工作的,尽管它似乎仍然是与类加载器相关的问题。 -
附加信息:我已经修改了结构,因此我现在使用应用程序上下文来指定我想要包含映射到 /WEB-INF/lib 的 jar,而不是使用 tomcat 的 shared.loader 属性.结果相同。我相信这排除了类加载器问题,并指出它仅从外部 jar 运行。
标签: java selenium tomcat logging classloader