`
kanpiaoxue
  • 浏览: 1777548 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Unable to locate Spring NamespaceHandler for XML schema namespace

 
阅读更多

我自己写了一个小项目,里面用到了spring的框架,最终打包成一个可运行的jar。结果就出现了问题。我在eclipse中开发的时候,这个程序是可以运行的。用maven打包之后,一运行就报错:

写道
Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop

 我找了好久,只能推断出是maven打包出的问题,但是没有想到思路如何解决。在google里面搜索了一下,真的发现和我遇到一样问题的哥们。他的blog中对这个问题描述的很好,我就不在多说了,直接把他的博文粘帖过来,他的地址是: http://chenzhou123520.iteye.com/blog/1971322

------------------ 内容如下:

----------------------------- 引用开始

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时就不会报错了。

 

关于maven-shade-plugin的使用,可以参考我另外一篇博文:使用maven插件对java工程进行打包

----------------------------- 引用结束

分享到:
评论

相关推荐

    maven项目使用assembly打包jar时处理Unable to locate Spring NamespaceHandler问题

    使用assembly插件打包jar后启动时,总是出现Unable to locate Spring NamespaceHandler for XML schema....错误,网上找了各种方法都没有用,在尝试了100+失败后,解决了这个问题,在打包的jar中,META-INF目录下,...

    springAOP demo 带错误解决文档

    在搭建spring项目时通常需要这些jar包 ...org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace ...

    Maven打包指南

    Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace ...

    临时存储

    在“spring-batch-example”这个压缩包中,我们很可能会找到一些示例代码或配置文件,展示如何在实际项目中利用Spring Batch的临时存储特性。这些示例可能包含如何设置JobRepository,如何定义分片策略,以及如何...

    《python3网络爬虫开发实战》学习笔记::selenium——xpath:Unable to locate element

    selenium+firefox在定位时遇到selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: 由于是js加载页面,想确认是否是js的原因,随后进行多次调试时发现“//div”竟然也出现了...

    linux gcc install

    在Linux系统中,GCC(GNU Compiler Collection)是一个关键的开源工具链,用于编译C、C++、Fortran、Objective-C等编程语言的源代码。它不仅包括了编译器,还包括预处理器、链接器和其他相关工具。...

    lingo0.9破解版

    lingo0.9破解版

    SpringMail使用过程中的报错解决办法

    1、Unable to locate provider for protocol: smtp –&gt;缺少依赖造成的 &lt;groupId&gt;javax.mail &lt;artifactId&gt;mail &lt;version&gt;1.4 &lt;groupId&gt;javax.activation &lt;artifactId&gt;activation&lt;/artifactId&gt;

    copy-webpack-plugin-demo.rar

    copy-webpack-plugin-demo.rar 拷贝文件demo, 现成案例,可以参考使用 免积分下载地址 https://download.lllomh.com/cliect/#/product/JB23148366892270

    ubuntu下mingw32交叉编译环境搭建

    Mingw32(Minimalist GNU for Windows 32-bit)是一种流行的交叉编译工具链,它可以用来在非 Windows 平台(如 Linux 或 Unix)上编译出可以在 Windows 上运行的程序。本文将详细介绍如何在 Ubuntu 系统中搭建一个...

    关于Matlab处理avi视频视频转换软件-XviD-1.2.2-07062009.rar

    Unable to locate decompressor to decompress video stream 此时即可利用此软件进行转换,转为'Cinepak'压缩格式的avi视频…… 转化完成后,利用aviinfo即可看到转化后avi视频的压缩格式…… 然后就可以...

    BCGControlBarPro.v12.00

    Implemented ability to add Ribbon Galleries to the dialogs (see screenshot). The new class CBCGPRibbonGalleryCtrl may be used for this purpose. Please take a look at BCGPMSOffice2007Demo example ...

    linux esential

    在文档中提到的“Linux System Administration 1 Study Guide for Labwork for LPI 101”是一个针对Linux专业人士认证(Linux Professional Institute Certification)第一级别(LPI 101)的学习指南。LPI是一个全球...

    玩酷之家系统引导修复工具BootRepair.rar

    软件介绍:  如果你的系统因各种原因出现开机不能引导,引导文件损坏不能进系统,不需要重新系统,先使用本工具进行修复,将系统引导修复工具BootRepair放到带有PE启动的U盘中,使用U盘来引导系统,运行Boot...

    Python3 venv搭建轻量级虚拟环境的步骤(图文)

    主要介绍了Python3 venv搭建轻量级虚拟环境的步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    VC 作界面库 美化 设计开发必备库BCGControlBarPro.v12.00完整源代码(破解版)

    BCGControlBarPro.v12.00完整源代码(含资源汉化帮助文件和VS2008中文向导)第三部分 使用方法: ... ...2、双击导入注册表C:\Program Files\BCGSoft\BCGControlBarPro\bcgcontrolbarpro.12.00.reg;...

    解决Qt Serialbus 报错3.5char问题源码

    在使用Qt进行串行通信开发时,可能会遇到一个与Qt Serialbus模块相关的错误,提示“dropping older ADU fragments due to larger than 3.5 char”。这个错误通常出现在处理CAN(Controller Area Network)协议的数据...

    docker容器调用yum报错的解决办法

    在本篇文章里小编给大家分享的是关于docker容器调用yum报错的解决办法,有兴趣的朋友们可以参考下。

Global site tag (gtag.js) - Google Analytics