“无法找到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中 – >单击完成