当spring.jar在WEB-INF / lib /而不是classpath时,Jetty上的Strange Spring行为

时间:2009-10-21 14:40:04

标签: eclipse spring java-ee jetty

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

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

1 个答案:

答案 0 :(得分:1)

听起来你的应用程序正在使用“外部”类路径上的东西(我将其称为X)并将其传递给引用;这很好用,因为'external'在你的应用程序的父类加载器中。

然后

'X'使用引用用spring做一些事情。但是,spring位于应用程序的类路径中,但X位于外部类路径上。因此,弹簧对X不可见,因此错误。

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

至于'X'是什么?最有可能的候选人将是公共记录,其历史悠久地与类加载器相关。您可能需要考虑使用slf4j实现(如Logback)并通过jcl-over-slf4j提供commons-logging接口

资源: