【问题标题】:Spring NamespaceHandler issue when launching Maven-based GWT App from Eclipse IDE after migration to Spring 3迁移到 Spring 3 后从 Eclipse IDE 启动基于 Maven 的 GWT 应用程序时出现 Spring NamespaceHandler 问题
【发布时间】:2011-07-13 09:25:45
【问题描述】:

这是一个我已经困扰了几个小时的问题,现在我感到非常绝望。 我将我们的应用程序从 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]

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

接下来,我像以前的版本一样构建了 WAR将其部署在 Tomcat 上,应用运行良好

由此我可以得出结论,Eclipse 环境配置中缺少某些内容。有趣的是,所有的抱怨都是关于 spring-tx,当我使用 tx 命名空间删除单行时 <tx:annotation-driven transaction-manager="transactionManager" /> .. 应用程序启动正常,没有抱怨其他命名空间(当然,它没有正常工作,但至少在初始化期间没有抱怨)。

关于我的 IDE/项目设置的一些总结:

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

正式的问题是:从 IDE 启动的项目在迁移到 Spring 3x 后出现此类错误的可能原因是什么(并且可以正常部署为构建的 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 中找到(并且在系统类路径中找到),但它没有像其他人那样添加?这种行为的原因是什么?

【问题讨论】:

  • 我在 GWT Google Group 上找到了以下帖子:groups.google.com/group/google-web-toolkit/browse_thread/thread/…
  • (.. 继续之前我无法编辑的未完成评论) 我在 GWT Google Group 上找到了以下主题:groups.google.com/group/google-web-toolkit/browse_thread/thread/…,之后我意识到可以应用以下解决方法:复制spring-tx-3.0.5.RELEASE.jar(这是我的情况)到/war/WEB-INF/lib。而且效果很好!但我仍然将其归类为一种解决方法,并且想知道在从 IDE 启动基于 Maven 的 GWT 应用程序时如何确保一致的类路径解析。
  • 当您构建 WAR 并部署到 Tomcat 时,它是 Maven 构建还是来自您的 IDE?尝试从您的 IDE 生成 WAR(右键单击 -> 导出 -> WAR)。然后解压缩或使用例如查看内部7-Zip 看看 Spring-Tx jar 是不是在打仗。然后我们知道 Eclipse 配置有问题。此外,请查看 Eclipse 中项目的构建路径设置。有 Spring-Tx 吗? Maven 是生成了您的 Eclipse 项目文件,还是您手动生成了?也许使用mvn eclipse:clean eclipse:eclipse 重新生成 Eclipse 项目文件。

标签: java eclipse spring gwt


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您的类路径上有多个 spring 依赖项,那么您可能会在使用 maven 时遇到此问题:

    When using mulitple Spring dependencies, the files from META-INF (from the Spring jars) overwrite each other in an executable jar-with-dependencies

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      相关资源
      最近更新 更多