2013-10-27 1 views
14

Я использую spring и hibernate в своем проекте java, который управляется maven. Я создал сборку (банку с зависимостями) с помощью следующей команды mvn install assembly:assemblyНевозможно найти пространство имен SpringHandler для пространства имен XML-схем http://www.springframework.org/schema/data/jpa

Теперь, когда я пытаюсь запустить мой основной класс с помощью команды: 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]

+4

Схема, скорее всего, отключена плагином сборки maven, см. Http://stackoverflow.com/questions/5586515/idea-to-avoid-that-spring-handlers-spring-schemas-get-overwritten-when -merging-m –

+0

@RC.: Но мой проект отлично работает, когда я запускаю это через затмение. Проблема заключается в том, что я запускаю ее через упакованную банку (банку с зависимостями). Есть какие-либо комментарии по этому поводу? – Arry

+0

"maven assembly plugin" = что делает банку с зависимостью, поэтому .. –

ответ

1

Для этого я использовал плагин [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) пост переполнения стека, в котором объясняется, как эти файлы используются.

+1

. Именно, файлы spring.schemas на каждом модуле Spring расположены в том же месте, с тем же именем. Таким образом, освобождение всех весенних банок, чтобы сделать один 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

-2

Я не очень хорошо знаком с целями сборки maven, но тот факт, что вы скопировали эти зависимости для компиляции времени, может означать, что эти зависимости не включены в сборку. Не могли бы вы попробовать удаление:

<scope>compile</scope>

частей из ваших объявлений зависимостей?

+0

Это не связано к проблеме, и удаление компиляции '' от зависимости не окажет никакого влияния. В maven скомпилирована область по умолчанию для зависимостей. – axiopisty

12

Возможно, вам лучше использовать плагин maven-shade для создания вашей банки с зависимостями. Вот пример того, как использовать плагин:

 <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-тень-плагин является лучшим способом создать убер банку. См. Мои другие SO answer для более полного примера. Обратите внимание, что в этом примере не требуются сторонние банки, но плагин maven-shade прекрасно справляется с ними. Дать ему шанс! :-)

+0

Для тех, кто использует Ant, [проверьте это] (http://stackoverflow.com/a/24083318/2208271). – Sithsu

0

Можете ли вы убедиться, что в вашей папке WEB-INF/lib есть пружинная банка?

А также убедитесь, что существует только 1 версия.

Если он все еще не работает, будет полезно, если вы можете прикрепить заголовок конфигурации, в дополнение к той части тела, которую вы уже вставили.