“无法找到Spring NamespaceHandler”错误
我正在使用Spring创建一个独立的Sava应用程序来处理JDBC访问。 该应用程序在每次测试中都能正常工作,我决定需要一个jar来部署我们的客户端。
他们的类路径中可能没有spring,所以我使用maven-assembly-plugin来处理带有依赖项的jar创建。
但是,当我尝试运行该应用程序时:
java -jar target/myproject-0.0.1-SNAPSHOT-jar-with-dependencies.jar
这会引发以下错误:
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/p] Offending resource: class path resource [applicationContext.xml] at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80) ...and so on to the database access class of this project.
applicationContext.xml文件位于projectbase / src / main / resources中。 它放在目标/包名称基础上。
applicationContext.xml
我今天用maven-assembly-plugin遇到了这个问题。 搜索让我想到了这个问题,看一下bug报告提示我可能正在使用错误的插件。 所以我切换到了maven-shade-plugin。 据我所知,它完美无缺。 我有一个可执行jar,它包含许多Spring模块以及Apache MQ。 这是我的pom.xml中的相关位:
sample-broker ... org.apache.maven.plugins maven-shade-plugin 2.0 package shade META-INF/spring.handlers META-INF/spring.schemas org.XYZ
我发现错误,错误在于maven-assembly插件中一个未修复的错误 。 我使用了以下解决方法:
首先在我的pom中注释掉了maven-assembly代码。 然后我使用maben-dependency-plugin将依赖项复制到目标的lib文件夹:
org.apache.maven.plugins maven-dependency-plugin copy-dependencies package copy-dependencies ${project.build.directory}/lib
然后我使用maven-jar-plugin来设置我的可执行jar:
org.apache.maven.plugins maven-jar-plugin 2.3.1 true true org.foo.myproject.App development ${pom.url} value
最后,我创建了一个bash脚本,该脚本与应用程序一起部署,该应用程序使用其libs和任何提供的参数运行我的app:
java -cp lib/*:myproject-0.0.1-SNAPSHOT.jar org.foo.myproject.App $@
我应该在python中构建应用程序= /
看起来像是Maven Assembly Plugin中的一个错误 – MASSEMBLY-360 ,正如本博客文章中所讨论的那样。
简而言之,处理Spring名称空间的Spring JAR中的元数据文件正被maven破坏。
onejar-maven-plugin允许您通过创建具有依赖项的单个jar文件来解决maven和spring矛盾。 它通过将jar文件放在另一个jar(one-jar)中来创建jar文件的包装器。
org.dstovall onejar-maven-plugin 1.4.4 one-jar org.apache.maven.plugins maven-jar-plugin 2.3.2 your.package.App onejar-maven-plugin.googlecode.com http://onejar-maven-plugin.googlecode.com/svn/mavenrepo
除了@GrampaJohn发布的解决方案之外,我还必须确保将所需的库打包到生成的JAR文件中,而不是将它们提取到生成的JAR中。
在Eclipse Mars中,在更改了pom.xml(添加了@GrampaJohn建议的maven-shade插件)之后,请按照以下步骤操作:
文件 – >导出 – >选择Java文件夹 – >可运行的JAR文件 – >输入启动配置(主文件),导出目标,然后在库处理中, 选择“将所需的包打包到生成的JAR中 – >单击完成
。