在用到spring時,本地IDE里面跑的很正常,但是打jar包后在集群上運行時報錯。
查找資料后確定了問題的根源,由於在依賴中調用了spring的許多包,每個包都有自己的spring.schemas文件,會存在文件覆蓋的情況。
報錯信息為:
Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace
解決方法:
方法一:
修改maven的settings.xml文件,在鏡像中添加
<mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror>
添加到<mirrors>與</mirrors>之間,注意原先是被注釋掉的,要在<mirrors>后面粘貼上
方法二:
使用maven的打包插件maven-shade-plugin,把spring.handlers、spring.schemas、spring.tooling三個文件設置成增量保存模式,即Appending
在maven的pom.xml中,在<project>和</project>之間加上下面的代碼
<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>
然后在maven窗口的plugin中即可找到package,就是這個打包工具
方法三:
這種方法比較小白,操作簡單,無論怎么打包,用什么工具,只要找到spring.handlers、spring.schemas、spring.tooling這三個文件,用我提供的這三個完整的文件覆蓋即可
一般來說,打完包之后,這三個文件都在jar包下面的META-INF路徑下,直接復制完整文件到這個目錄下覆蓋即可
下載鏈接為http://files.cnblogs.com/files/starwater/spring.zip 包含了spring.handlers、spring.schemas、spring.tooling這三個完整的文件