Unable to locate Spring NamespaceHandler for XML schema namespace

java服务中整合了spring,在Eclipse里本地启动时没问题,但是部署到局域网linux服务器上时解析spring applicationContext.xml报错,具体报错信息如下:

Console代码  

  1. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]

关于这个问题,纠结了我大半天时间,网上的资料也是众说纷纭,有的说是spring版本不统一、有些说是缺少对应的spring依赖的。不过这些原因都被我逐一排除了。

功夫不负有心人,在仔细地对比和排查原因之后,发现了问题的所在,在我的jar包下的META-INF目录下,有两个跟spring相关的文件:spring.handlers、spring.schemas,打开这两个文件一看,里面都只包含了spring-tx的配置

spring.handlers:

Txt代码  

  1. http\://www.springframework.org/schema/tx=org.springframework.transaction.config.TxNamespaceHandler

spring.schemas:

Txt代码  

  1. http\://www.springframework.org/schema/tx/spring-tx-2.0.xsd=org/springframework/transaction/config/spring-tx-2.0.xsd
  2. http\://www.springframework.org/schema/tx/spring-tx-2.5.xsd=org/springframework/transaction/config/spring-tx-2.5.xsd
  3. http\://www.springframework.org/schema/tx/spring-tx-3.0.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd
  4. http\://www.springframework.org/schema/tx/spring-tx-3.1.xsd=org/springframework/transaction/config/spring-tx-3.1.xsd
  5. http\://www.springframework.org/schema/tx/spring-tx.xsd=org/springframework/transaction/config/spring-tx-3.1.xsd

里面并没有spring-context的schema和handler配置,所以会报错。

那么问题的根源是什么呢,在stackoverflow上找到了答案:http://stackoverflow.com/questions/1937767/spring-3-0-unable-to-locate-spring-namespacehandler-for-xml-schema-namespace

因为我使用了maven-shade-plugin这个maven打包插件,主要原因是插件配置不当导致,我原来的配置如下:

Xml代码  

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-shade-plugin</artifactId>
  4. <version> 1.7.1</version>
  5. <executions>
  6. <execution>
  7. <phase>package</phase>
  8. <goals>
  9. <goal>shade</goal>
  10. </goals>
  11. <configuration>
  12. <transformers>
  13. <transformer
  14. implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  15. <mainClass>com.chenzhou.test.Main</mainClass>
  16. </transformer>
  17. </transformers>
  18. </configuration>
  19. </execution>
  20. </executions>
  21. </plugin>

由于没有配置META-INF/spring.handlers和META-INF/spring.schemas所以如果工程中依赖了Spring的多个依赖,在打包时后面的会把前面的覆盖,使得这两个文件中永远只保存最后一个spring依赖的schema和handler。

解决方法就是在里面加上META-INF/spring.handlers和META-INF/spring.schemas的配置:

Xml代码  

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-shade-plugin</artifactId>
  4. <version> 1.7.1</version>
  5. <executions>
  6. <execution>
  7. <phase>package</phase>
  8. <goals>
  9. <goal>shade</goal>
  10. </goals>
  11. <configuration>
  12. <transformers>
  13. <transformer
  14. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  15. <resource>META-INF/spring.handlers</resource>
  16. </transformer>
  17. <transformer
  18. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  19. <resource>META-INF/spring.schemas</resource>
  20. </transformer>
  21. <transformer
  22. implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  23. <mainClass>com.chenzhou.test.Main</mainClass>
  24. </transformer>
  25. </transformers>
  26. </configuration>
  27. </execution>
  28. </executions>
  29. </plugin>

和第一段配置对比,主要增加了:

Xml代码  

  1. <transformer
  2. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  3. <resource>META-INF/spring.handlers</resource>
  4. </transformer>
  5. <transformer
  6. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  7. <resource>META-INF/spring.schemas</resource>
  8. </transformer>

这段配置意思是把spring.handlers和spring.schemas文件以append方式加入到构建的jar包中。

修改完后,再次打包,此时就会把工程依赖的所有的spring依赖的schema和handler都加载到spring.handlers和spring.schemas里面。加载applicationContext.xml时就不会报错了。

时间: 2024-10-24 13:04:59

Unable to locate Spring NamespaceHandler for XML schema namespace的相关文章

mvn打包spring工程成jar时报Unable to locate Spring NamespaceHandler for XML schema namespace错误解决办法

有一个小工程,使用了spring,在使用maven的assembly打包成独立可执行的jar包后,在执行时报如下错误:Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace      网上对这个问题也有提及,这是assembly的一个bug.参见:http://jira.codehaus.org/browse/MASSEMBLY-360 原因是spring的多个jar包中都含

打成Jar包后运行报错 Unable to locate Spring NamespaceHandler for XML schema namespace

MAVEN项目,在IDEA中运行正常,但是把它打成jar包后再运行就会出现异常: Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.sp

spring 与 CXF 整合 webservice 出现error “Unable to locate Spring NamespaceHandler for XML schema namespace” 总结

我试了多个版本的spring 发现 出现error : Unable to locate Spring NamespaceHandler for XML schema namespace 并非都是spring.schemas 和 spring.handlers 两个文件覆盖缺少等造成的问题. 出现error原因: spring 版本 通过cxf 自带的spring jar包看来  只与最稳当的spring.3.0.5 兼容.所以在整合spring 与 cxf 的时候, 最后不要自己去另外加spr

Spring 3.0: Unable to locate Spring NamespaceHandler for XML schema namespace

被这个问题折磨着很久:参考: http://have23.iteye.com/blog/1340777 (cfx 与 spring 整合的时候出现的问题: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://c

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

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/security]Offending resource: file [D:\work\wtgs.

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

使用maven构建spring security的一个demo时出现了这个问题,网上找了很长时间,很多答案都不适合自己. 1.一开始根据提示以为是xsd和jar包的版本冲突问题,参考了这篇文章 http://www.baeldung.com/unable-to-locate-spring-namespacehandler-for-xml-schema-namespace, 修改xsd和jar包版本一致,但是还是报同样的问题. 2.后来找到一些答案可能是META-INF文件中spring.sche

Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace 解决方法

这个问题是在用到spring时,本地IDE里面跑的很正常,但是打包后在集群上运行时报错. 多方查找资料后确定了问题的根源,由于在依赖中调用了spring的许多包,会存在文件覆盖的情况. 具体是 这三个文件.查看后,只剩下tx的配置了. 解决方法 第一种方法是使用maven的打包插件,在里面保留各个spring包的配置信息: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mav

Spring事务——使用XML Schema配置事务策略

Spring同时支持编程式事务策略和声明式事务策略,通常推荐采用声明式事务策略.具体实现过程如下: 1.定义一个接口NewsDao,代码如下: package com.hyq.chapter08_06_2.dao; public interface NewsDao { public void insert(String title,String content); } 2.定义接口的实现类NewsDaoImpl,代码如下: 1 package com.hyq.chapter08_06_2.dao

曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的

写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean de