【问题标题】:Unable to locate Spring NamespaceHandler for XML schema namespace http://www.springframework.org/schema/data/jpa找不到 XML 模式命名空间 http://www.springframework.org/schema/data/jpa 的 Spring NamespaceHandler
【发布时间】:2013-11-06 02:21:08
【问题描述】:

我在由 maven 管理的 java 项目中使用 spring 和 hibernate。我使用以下命令创建了一个程序集(带有依赖项的 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>

我确实尝试了以下线程中的建议,但它对我不起作用。 Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/jpa]

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

【问题讨论】:

  • 架构很可能被 maven 程序集插件剥离,请参阅 stackoverflow.com/questions/5586515/…
  • @RC.:但是当我通过 Eclipse 运行它时,我的项目运行良好。问题是当我通过打包的 jar(具有依赖项的 jar)运行它时。对此有何评论?
  • "maven 程序集插件" = 是什么让 jar 具有依赖关系,所以..
  • 有什么解决办法吗?
  • 查看链接的问题答案!

标签: java spring maven spring-data-jpa


【解决方案1】:

您最好使用 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 是创建 uber jar 的最佳方式。有关更完整的示例,请参阅我的另一个 SO answer。请注意,此示例不需要任何 3rd 方 jar,但 maven-shade-plugin 确实可以很好地处理它们。试一试! :-)

【讨论】:

    【解决方案2】:

    我为此使用了 [one-jar] 插件 (https://code.google.com/p/onejar-maven-plugin/)。

    我遇到了同样的问题;即 maven 程序集弄乱了我的 spring.schema 文件。 (已知 Maven 的插件可以做到这一点(来自另一个体验 same issue 的人的春季论坛链接)。

    如果您真的想知道这里发生了什么,请展开您的 .jar 文件并查看 spring.schema 和 spring.handlers 文件。查看 maven 的组装插件的产品,阅读这篇 (Need understanding of spring.handlers and spring.schemas) 堆栈溢出帖子,它解释了如何使用这些文件。

    【讨论】:

    • 没错,每个Spring模块上的spring.schemas文件都位于同一个地方,同名。因此,将所有 Spring jar 解压成一个 JAR 是行不通的。您必须单独打包每个 JAR,否则您最终只会得到一个 spring.schemas 文件。 One-jar 插件绝对可以提供帮助。这就是 Spring Boot Maven 插件的作用 (projects.spring.io/spring-boot/docs/spring-boot-tools/…)
    【解决方案3】:

    你能确定你的 WEB-INF/lib 文件夹中有 Spring jar 吗?

    还要确保只存在 1 个版本。

    如果还是不行,如果你能附上配置的标题,除了你已经粘贴的正文部分,将会很有帮助。

    【讨论】:

      【解决方案4】:

      我对 maven 程序集目标并不十分熟悉,但您将这些依赖项限定为编译时的事实可能意味着这些依赖项不包含在程序集中。您可以尝试删除:

      &lt;scope&gt;compile&lt;/scope&gt;

      依赖声明的部分内容?

      【讨论】:

      • 这与问题无关,从依赖中删除&lt;scope&gt;compile&lt;/scope&gt;不会有任何影响。在 maven 中,依赖项的默认作用域是 compile。
      猜你喜欢
      • 2012-02-05
      • 2017-02-18
      • 2015-10-29
      • 2013-04-16
      • 2019-08-08
      • 2012-01-21
      • 2013-11-01
      • 2011-11-03
      • 2014-04-19
      相关资源
      最近更新 更多