被这个问题折磨着很久:参考: 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://cxf.apache.org/jaxws]
Offending resource: ServletContext resource [/WEB-INF/spring.xml]

Key Words

Spring 3.0

Apache CXF 2.X.X

昨日,在原本应用中添加了关于webService的调用,使用了Apache CXF 框架,并将其集成到了Spring中。

当时集成时,使用了如下的jar包(Spring2.5.5.JPG)

加入CXF的相关jar包


 然后将WebService客户端集成到Spring中,代码类似于:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:jaxws="http://cxf.apache.org/jaxws"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  8. <jaxws:client id="helloClient"
  9. serviceClass="demo.spring.HelloWorld"
  10. address="http://localhost:9002/HelloWorld" />
  11. </beans>

然后在Myeclipse 8.5上进行了测试,运行通过。

然后通过Fat jar打成jar包进行发布。对,这不是一个web应用。

到了实际部署环境,刚运行就出现:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-2.5.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

出现这个错。我的第一判断是jar有冲突。你懂的

于是,我从早上11点到下午5点,来解决这个jar包冲突的问题,做了一下的工作

1.从Spring2.5.5 换到Spring.3.0.5

2.将CXF2.3.1换到CXF2.5.1

最终的结果是:蛋都碎了。。。

而且还出现了新的问题:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://cxf.apache.org/schema/jaxws.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

终于意识到,不是jar包的问题。而是SAXParse没有正常工作。于是去网上转了一圈,有如下结果

http://stackoverflow.com/questions/1937767/spring-3-0-unable-to-locate-spring-namespacehandler-for-xml-schema-namespace

“What IDE (if any) are you using? Does this happen when you're working within an IDE, or only on deployment? If it's deployment, it might be because whatever mechanism of deployment you use -- maven-assembly making a single JAR with dependencies is a known culprit -- is collapsing all your JARs into a single directory and the Spring schema and handler files are overwriting each other.”

我英文一般的很,这段话大概的意思就是

使用maven-assembly 插件压缩的all your jars到一个单一目录,并且Spring schema and handler files互相覆盖。

可惜,我没有使用maven。Spring schema and handler files 是什么

Spring步入到3.0后,出现了一些显著的变化就是没有提供spring.jar了,而采用了不同功能的jar

而几乎每个jar包中都存在

这就是导致出现

Unable to locate Spring NamespaceHandler for XML schema namespace的问题。

接下来,你可以参考

http://stackoverflow.com/questions/3650252/problem-starting-spring-application-from-java

你可以选择手工合并所有的spring.handlers与spring.schemas,或者和我一样换回到Spring 2.5,并将cxf2.x.x.jar中的这两个文件重新命名,然后不使用Spring集成,先让程序跑起来不影响业务。

参考

https://jira.springsource.org/browse/SPR-8368

这里面说的更加详细一些

With the splitting of Spring Framework into multiple jar files in v3.0, there are now several files named "META-INF/spring.handlers", "spring.schemas" and "spring.tooling". This is not a problem when running in a normal servlet container, but poses problems when e.g. creating an executable JAR file from a webapp using an embedded web server such as Jetty, or running GWT in "Dev Mode", which uses a custom class loader.

The workaround is to construct your own "custom" version of these three files, merging all the copies into one like so:

//IOUtils and FileUtils come from Apache Commons IOfor(String s : new String[] {"spring.schemas", "spring.handlers", "spring.tooling"}) {
Enumeration<?> e = Test.class.getClassLoader().getResources("META-INF/"+s);
StringBuilder out = new StringBuilder();while(e.hasMoreElements()) { URL u = (URL) e.nextElement(); out.append(IOUtils.toString(u.openStream())).append("\n"); }
File outf = new File(s);
FileUtils.writeStringToFile(outf, out.toString(), "UTF-8");
}

However, the proper fix would be to use a different file-name for each instance of the schemas/handlers/tooling files. For example, inside "org.springframework.aop-3.0.5.RELEASE.jar/META-INF" you would find "spring-aop.schemas", "spring-aop.handlers" and "spring-aop.tooling".

I'm afraid I'm not sufficiently up-to-speed with the Spring code-base to give you a patch to do this, however a brief investigation shows that "spring.handlers" and "spring.schemas" are specified in org.springframework.beans.factory.xml.PluggableSchemaResolver and DefaultNamespaceHandlerResolver, and that constructors exist for specifying different locations for these files. I hope you find this information useful.

或许这个已经在新版本里面已经fixed了,我已经下了最新的版本,还没有来得及测试。

如果你也遇到这个问题,首先恭喜你。

其次,你可以按照以上的方式做一个 “your own "custom" version of these three files”,使用

  1. //IOUtils and FileUtils come from Apache Commons IOfor(String s : new String[] {"spring.schemas", "spring.handlers", "spring.tooling"}) {
  2. Enumeration<?> e = Test.class.getClassLoader().getResources("META-INF/"+s);
  3. StringBuilder out = new StringBuilder();while(e.hasMoreElements()) { URL u = (URL) e.nextElement(); out.append(IOUtils.toString(u.openStream())).append("\n"); }
  4. File outf = new File(s);
  5. FileUtils.writeStringToFile(outf, out.toString(), "UTF-8");
  6. }

合并文件以后,来代替jar包中\META-INF\spring.schemas,\META-INF\spring.handlers,

\META-INF\spring.tooling,就可以了.

最好的办法是通过maven去打包在POM.xml中增加

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-shade-plugin</artifactId>
  4. <version>1.6</version>
  5. <configuration>
  6. <!-- put your configurations here -->
  7. </configuration>
  8. <executions>
  9. <execution>
  10. <phase>package</phase>
  11. <goals>
  12. <goal>shade</goal>
  13. </goals>
  14. <configuration>
  15. <transformers>
  16. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  17. <manifestEntries>
  18. <Main-Class>util.Process</Main-Class>
  19. </manifestEntries>
  20. </transformer>
  21. <transformer
  22. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  23. <resource>META-INF/cxf/bus-extensions.txt</resource>
  24. </transformer>
  25. <transformer
  26. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  27. <resource>META-INF/spring.handlers</resource>
  28. </transformer>
  29. <transformer
  30. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  31. <resource>META-INF/spring.tooling</resource>
  32. </transformer>
  33. <transformer
  34. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  35. <resource>META-INF/spring.schemas</resource>
  36. </transformer>
  37. </transformers>
  38. </configuration>
  39. </execution>
  40. </executions>
  41. </plugin>

来合并这些文件,来保证在打包时这些文件不会互相覆盖。

最新文章

  1. Java的Debug调试
  2. 基于Netty与RabbitMQ的消息服务
  3. hadoop-MapReduce分布式计算框架
  4. Jquery 基本知识(一)
  5. [课程设计]Scrum 2.2 多鱼点餐系统开发进度(下单页面修复&amp;美化)
  6. 本博客停止更新,移至purecpp.org
  7. Android JNI使用方法
  8. QT 判断当前焦点是否在某控件上(使用hasFocus函数,毕竟QT是DIRECTUI,所以这个Focus到底代表了什么呢?)
  9. 学习Java第一天,大致了解
  10. 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构
  11. node.js 运行机制与简单使用
  12. [转]Navicat Premium 12试用期的破解方法
  13. MVC登录校验
  14. canal 入门
  15. 网络编程 tcp(一)
  16. 自我总结 (三) --(Java Web学习)
  17. 组件 -- Badge
  18. 【加密算法】3DES
  19. 献给java求职路上的你们
  20. SQL SERVER2008 镜像全攻略

热门文章

  1. IOS_设置启动图片若干问题
  2. 安装mongodb后服务启动不了的问题
  3. CLR via C# 线程基础知识读书笔记
  4. Oracle 摘去数据块的面纱
  5. ASP.NET Core 行军记 -----拔营启程
  6. 世界级Oracle专家Jonathan Lewis:我很为DBA们的未来担心(图灵访谈)
  7. 查看表空间信息SQL集合
  8. 详解C/C++预处理器
  9. unity项目实现“再按一次退出程序”提示功能
  10. 小杜同学关于Query的一点知识