无法找到Spring NamespaceHandler,用于XML模式命名空间http://www.springframework.org/schema/data/jpa。

14

我的Java项目中使用了Spring和Hibernate框架,并由Maven进行管理。我使用以下命令创建一个包含依赖项的汇编文件(JAR文件):mvn install assembly:assembly

现在,当我尝试使用以下命令运行我的主类时:java -cp xyz-1.0-SNAPSHOT-jar-with-dependencies.jar com.xyz.class,我收到以下错误:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/jpa]**
Offending resource: class path resource [xyz-component-scans-config.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:76)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:271)
.
.

我不明白为什么它无法找到NamespaceHandler?因为我已经在pom中添加了以下依赖。

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.1.0.RELEASE</version
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>1.0.2.RELEASE</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency> 
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.1.0.RELEASE</version>
      <scope>compile</scope>
    </dependency>

我尝试了以下主题中的建议,但对我没有起作用。无法定位Spring XML模式命名空间[http://www.springframework.org/schema/data/jpa]的NamespaceHandler

org.springframework.beans.factory.parsing.BeanDefinitionParsingException 的源代码


4
这个 schema 很可能会被 Maven Assembly 插件移除,详见 https://dev59.com/RW035IYBdhLWcg3wKsua。 - user180100
@RC:但是当我通过Eclipse运行项目时,它可以正常运行。问题出现在我通过打包好依赖的jar文件运行时。对此有什么评论吗? - Arry
有什么解决方法吗? - Arry
@RC:没有运气!我尝试使用maven-shade-plugin生成jar文件,但是在运行新的jar文件时仍然出现了相同的问题。 - Arry
有了这个装配,第一个(或最新的,取决于覆盖)spring.schemas将成为您的JAR中唯一的一个。您需要以不同的方式打包它,使每个库都打包在自己的JAR中,就像使用https://code.google.com/p/onejar-maven-plugin/一样。 - Tome
显示剩余3条评论
4个回答

14

你最好使用maven-shade-plugin来创建带有依赖项的jar包。以下是使用该插件的示例:

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>2.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.stackexchange.stackoverflow.ExecutableJar</mainClass>
                  </transformer>
                  <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>
                </transformers>
              </configuration>
            </execution>
          </executions>
        </plugin>

根据我的经验,maven-shade-plugin是创建超级jar的最佳方式。请查看我在SO答案中提供的更完整的示例。请注意,此示例不需要任何第三方JAR文件,但maven-shade-plugin可以很好地处理它们。试一试吧! :-)


1
我使用了[one-jar]插件(https://code.google.com/p/onejar-maven-plugin/)。我遇到了同样的问题,即Maven Assembly破坏了我的spring.schema文件。(已知Maven的插件会导致这种情况(spring论坛链接来自另一个经历过同样问题的人))。如果你真的想知道这里发生了什么,请展开你的.jar文件并查看spring.schema和spring.handlers文件。查看Maven Assembly插件生成的产品,阅读这篇(需要理解spring.handlers和spring.schemas)Stack Overflow文章,解释了这些文件的用途。

1
确切地说,每个Spring模块上的spring.schemas文件都位于相同的位置,并具有相同的名称。因此,解压所有Spring JAR以制作单个JAR是行不通的。您必须单独打包每个JAR,否则您最终只会得到一个spring.schemas文件。One-jar插件肯定可以帮助解决这个问题。例如,Spring Boot Maven插件就是这样做的(http://projects.spring.io/spring-boot/docs/spring-boot-tools/spring-boot-maven-plugin/README.html)。 - Tome

0

请确保您的WEB-INF/lib文件夹中有Spring jar包。

同时确保只存在一个版本。

如果仍然无法正常工作,如果您可以附加配置头部以及已经粘贴的部分主体,将会非常有帮助。


-2

我对Maven Assembly目标不是很熟悉,但你将这些依赖项的范围限定为仅编译时,这意味着这些依赖项可能不会包含在程序集中。你可以尝试从依赖声明中删除以下部分:

<scope>compile</scope>

看看是否能解决问题?


这与问题无关,从依赖项中删除<scope>compile</scope>将不会产生任何影响。在Maven中,依赖项的默认范围是编译。 - axiopisty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接