java服务中整合了spring,在Eclipse里本地启动时没问题,但是部署到局域网linux服务器上时解析spring applicationContext.xml报错,具体报错信息如下:
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:
http\://www.springframework.org/schema/tx=org.springframework.transaction.config.TxNamespaceHandler
spring.schemas:
http\://www.springframework.org/schema/tx/spring-tx-2.0.xsd=org/springframework/transaction/config/spring-tx-2.0.xsd http\://www.springframework.org/schema/tx/spring-tx-2.5.xsd=org/springframework/transaction/config/spring-tx-2.5.xsd http\://www.springframework.org/schema/tx/spring-tx-3.0.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd http\://www.springframework.org/schema/tx/spring-tx-3.1.xsd=org/springframework/transaction/config/spring-tx-3.1.xsd 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打包插件,主要原因是插件配置不当导致,我原来的配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version> 1.7.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.chenzhou.test.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
由于没有配置META-INF/spring.handlers和META-INF/spring.schemas所以如果工程中依赖了Spring的多个依赖,在打包时后面的会把前面的覆盖,使得这两个文件中永远只保存最后一个spring依赖的schema和handler。
解决方法就是在里面加上META-INF/spring.handlers和META-INF/spring.schemas的配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version> 1.7.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.chenzhou.test.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
和第一段配置对比,主要增加了:
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer>
这段配置意思是把spring.handlers和spring.schemas文件以append方式加入到构建的jar包中。
修改完后,再次打包,此时就会把工程依赖的所有的spring依赖的schema和handler都加载到spring.handlers和spring.schemas里面。加载applicationContext.xml时就不会报错了。
关于maven-shade-plugin的使用,可以参考我另外一篇博文:使用maven插件对java工程进行打包
相关推荐
使用assembly插件打包jar后启动时,总是出现Unable to locate Spring NamespaceHandler for XML schema....错误,网上找了各种方法都没有用,在尝试了100+失败后,解决了这个问题,在打包的jar中,META-INF目录下,...
在搭建spring项目时通常需要这些jar包 ...org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace ...
NULL 博文链接:https://1157718866.iteye.com/blog/2406566
selenium+firefox在定位时遇到selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: 由于是js加载页面,想确认是否是js的原因,随后进行多次调试时发现“//div”竟然也出现了...
linux gcc install 很全的linux gcc 安装,对离线安装gcc很有帮助...
lingo0.9破解版
Ubuntu12.04(64bit) server Oracle 11G(最新问题解决)
1、Unable to locate provider for protocol: smtp –>缺少依赖造成的 <groupId>javax.mail <artifactId>mail <version>1.4 <groupId>javax.activation <artifactId>activation</artifactId>
copy-webpack-plugin-demo.rar 拷贝文件demo, 现成案例,可以参考使用 免积分下载地址 https://download.lllomh.com/cliect/#/product/JB23148366892270
ubuntu下mingw32交叉编译环境搭建,包含详细的步骤和执行命令行。
非常经典的linux入门教程,无需基础,是权威认证机构的教材,这只是一部分
主要介绍了Python3 venv搭建轻量级虚拟环境的步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在本篇文章里小编给大家分享的是关于docker容器调用yum报错的解决办法,有兴趣的朋友们可以参考下。
设计关键字驱动web自动化测试框架模版,代码0基础小白也能玩web自动化,已打包已打包exe可执行文件:其中亮点@tkinter框架GUI,pyinstaller打包命令,selenium关键字驱动等等技术,运行需要python环境及所需selenium...
Java 第01-02章 Java概述_Java环境配置
RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~
runas /u:domain\username | sanur password runas /u:domain\username | sanur /i password.txt
这个是一个Git常用命令的小集合, 在日常开发和使用当中比较常见, 这个是一个txt的精简版, 非常小巧轻便
该文档是关于lingo软件的基础使用方法,方便初学者接触lingo时进行使用查阅和学习。
1,安装SSH服务 Ubuntu中安装SSH服务很简单,直接使用软件包管理工具: sudo apt-get install openssh-server 默认安装后会自动自动SSH服务的,不需要进行额外的配置除非特殊需要。 2,配置SSH服务(可省略) ...