当 spring.jar 位于 WEB-INF/lib/ 而不是类路径中时,Jetty 上的 Spring 行为奇怪

StackOverflow https://stackoverflow.com/questions/1601282

  •  05-07-2019
  •  | 
  •  

我正在使用 run-jetty-run 插件运行 Eclipse 来启动我的 J2EE Web 应用程序。我的项目使用Spring,并且spring配置使用HttpInvokerProxy和属性占位符之类的东西。

  1. 当 spring jar 位于类路径(我的意思是在“运行配置”的“类路径”选项卡中配置)和外部(不在 WEB-INF/lib 中)时,一切正常。
  2. 但是当我将 spring.jar (或所有 spring jar)放在 WEB-INF/lib/ 目录(+在类路径中引用)中时,麻烦就开始了。我尝试了 Jetty 的两个值 父加载器优先级:
    1. 当parentLoaderPriority为 true, ,我收到 Xerces 的投诉,说它无法验证 spring.xml 的 XSD(所以我猜 Jetty 嵌入的不同版本的 xerces 与我的冲突)
    2. 当parentLoaderPriority为 false, ,属性占位符不再起作用并且(我尝试用直接值替换)Spring也无法将HttpInvokerProxy转换为正确的接口,就像缺少一些类一样
  3. 最后,当我将所有 jar 留在 WEB-INF/lib 中并删除匹配的类路径条目时,它找不到类:尽管 google-collections.jar 位于 WEB-INF/lib 中并包含类文件,但我收到 ClassDefNotFoundException com/google/common/collect/Lists...这两个值都是 父加载器优先级.

不过,方法 #3 在 Tomcat 中工作得很好。所以我猜这个码头启动器有一些我做错的类加载配置?

有帮助吗?

解决方案

听起来您的应用程序正在使用“外部”类路径上的某些内容(我将其称为 X)并传递给它一个引用;这工作得很好,因为“外部”位于应用程序的父类加载器中。

然后“X”使用该引用对 spring 执行某些操作。但是,spring 位于应用程序的类路径上,但 X 位于外部类路径上。因此 Spring 对 X 不可见,因此会出现错误。

正如您所发现的,将 spring 放入外部类路径是一种有效的解决方法。如果 spring 同时位于外部类路径和 Web 应用程序类路径中,这也应该有效。

至于“X”是什么?最有可能的候选者是公共日志记录,它有着与类加载器混在一起的悠久历史。您可能需要考虑使用 slf4j 实现(例如 Logback)并通过 jcl-over-slf4j 提供公共日志记录接口

资源:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top