迁移到Spring 3后,从Eclipse IDE启动基于Maven的GWT App时出现Spring NamespaceHandler问题

这是一个我已经坚持了好几个小时的问题,到现在为止我感到非常绝望。 我将我们的应用程序从Spring 2.5 / Hiberante 3.3迁移到Spring 3.0.5 / Hibernate 3.6。 完成以下工作:

  • 更新的spring依赖项/版本(现在不仅仅是一些依赖项)
  • 更新了Hibernate依赖项/版本
  • 根据’schemaLocation’的版本更新Spring上下文XML文件

在经过不同的小修复和调整后从Eclipse IDE启动时仍然存在的错误如下:

Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/tx] 

我查看了其他线程,并意识到当在类路径中找不到特定的lib(在本例中为spring-tx)时会出现这样的问题,但我在Maven依赖项中清楚地看到它。

我做的下一件事是,我为以前的版本构建了WAR将它部署在Tomcat上,应用程序运行良好

通过这个我可以得出Eclipse环境配置中缺少某些东西的结论。 有趣的是,所有抱怨都是关于spring-tx, – 当我使用tx命名空间删除单行 ..应用程序启动正常而没有抱怨其他命名空间(当然,它没有正常工作,但至少在初始阶段没有抱怨)。

关于我的IDE /项目设置的一些摘要:

  • 应用程序启动由GWT .launch文件执行(GWT ver 2.0.3)
  • 在此启动文件中,有对其他项目的引用,包括具有spring依赖项的serverside
  • 事实上,这个gwt-client项目将服务器端POM作为父级,因此我看到该项目的Maven依赖项中的所有spring依赖项
  • GWT-client项目有/war/WEB-INF/applicationContext.xml,它导入其他上下文XML资源,实际上是使用spring-tx

正式的问题是:在迁移到Spring 3x之后,从IDE启动项目会导致此类错误的原因是什么(并且可以作为构建的WAR正常部署)?

我不指望直接的答案(除非有人有完全相同的环境和问题),但指导方针,建议会有很大的帮助!

编辑忘记提及在IDE启动应用程序期间,我有一堆这样的警告:

 [WARN] Server class 'javax.persistence.EntityManagerFactory' could not be found in the web app, but was found on the system classpath [WARN] Adding classpath entry 'file:/D:/maven/repository/org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.0.Final/hibernate-jpa-2.0-api-1.0.0.Final.jar' to the web app classpath for this session [WARN] Server class 'org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor' could not be found in the web app, but was found on the system classpath [WARN] Adding classpath entry 'file:/D:/maven/repository/org/springframework/spring-orm/3.0.5.RELEASE/spring-orm-3.0.5.RELEASE.jar' to the web app classpath for this session 

..所以也许spring-tx也没有在web-app中找到(并且在系统类路径中找到),但它没有像其他人那样添加? 这种行为的原因是什么?

在使用Maven进行开发时,您应该在调用mvn package之后从target/${project.finalName}文件夹启动DevMode,或者只是mvn war:exploded (这会将依赖项复制到WEB-INF/lib )。
请参阅http://code.google.com/eclipse/docs/faq.html#gwt_with_maven和http://code.google.com/p/google-web-toolkit/issues/detail?id=6619

如果你的类路径有多个spring依赖项,那么你可能会遇到maven的这个问题:

当使用多个Spring依赖项时,来自META-INF(来自Spring jar)的文件在可执行jar-with-dependencies中相互覆盖

要解决这个问题,请参阅Chris Wilkes的评论。 您需要将spring.handlers和spring.schemas复制到META-INF目录中。