2010-07-26 24 views
15

Tworzę autonomiczną aplikację Sava ze Spring, aby obsłużyć dostęp JDBC. Aplikacja działa dobrze na każdym teście i zdecydowałem, że potrzebuję słoika do wdrożenia naszych klientów.Kolejny "nie można zlokalizować Spring NamespaceHandler" error

Mogą nie mieć źródła w swojej ścieżce klasowej, więc użyłem wtyczki maven-assembly do obsługi kreacji słoików z zależnościami.

Jednak kiedy próbuję uruchomić aplikację:

java -jar target/myproject-0.0.1-SNAPSHOT-jar-with-dependencies.jar 

Co rzuca się następujący błąd:

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. 

Plik applicationContext.xml jest w projectbase/src/main/zasobów. I umieszczona w bazie docelowej/nazwy pakietu.

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 


    <bean id="dataSourceDesenv" class="org.apache.commons.dbcp.BasicDataSource"... /> 

    <bean id="simpleJdbcDaoSupport" class="org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport" 
     p:dataSource-ref="dataSourceDesenv" /> 

    <bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
     <constructor-arg ref="dataSourceDesenv" /> 
    </bean> 

</beans> 

To wszystko, co mogę myśleć, że może być przydatny. Na prośbę podam więcej informacji.

+0

Ten błąd oznacza brakujące nagłówki w pliku applicationContext.xml. Opublikuj ten plik lub przynajmniej nagłówek i element główny oraz kilka próbek. –

Odpowiedz

8

Znalazłem błąd, błąd leży w unfixed bug in the maven-assembly plugin. Użyłem następującego obejścia:

Najpierw skomentowałem kod maklerskiego zespołu w moim pom. Potem kopiowane zależności do lib folderu na cel za pomocą Maben zależność plugin:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

następnie użyłem maven-jar-plugin ustawienia mojego wykonywalny słoik:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.3.1</version> 
      <configuration> 
       <archive> 
        <index>true</index> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>org.foo.myproject.App</mainClass> 
        </manifest> 
        <manifestEntries> 
         <mode>development</mode> 
         <url>${pom.url}</url> 
         <key>value</key> 

        </manifestEntries> 
       </archive> 
      </configuration> 
     </plugin> 

Wreszcie stworzyłem skrypt bash, który jest wdrożony z aplikacji, która prowadzi moją aplikację z jego bibliotekami oraz wszelkich przewidzianych argumenty

java -cp lib/*:myproject-0.0.1-SNAPSHOT.jar org.foo.myproject.App [email protected] 

powinienem był zbudowany z aplikacji w Pythonie =/

4

Wygląda jak błąd w wtyczce zespołu Maven - MASSEMBLY-360, i jak omówiono w tym wpisie na blogu here.

Krótko mówiąc, pliki metadanych w jarach Spring, które obsługują przestrzenie nazw Spring, są zmanipulowane przez maven.

29

Wpadłem dziś na ten problem z wtyczką maven-assembly. Wyszukiwanie doprowadziło mnie do tego pytania, a wygląd raportu o błędzie sugerował, że być może użyłem niewłaściwej wtyczki. Więc przełączyłem się na wtyczkę maven-shade. Działa doskonale, o ile wiem. Mam plik wykonywalny, który zawiera wiele modułów Spring, jak również Apache MQ. Oto odnośny nieco z mojego pom.xml:

<build> 
<finalName>sample-broker</finalName> 
<plugins> 
    ... 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.0</version> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
     </goals> 
     <configuration> 
      <transformers> 
      <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> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
       <mainClass>org.XYZ</mainClass> 
      </transformer> 
      </transformers> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 
</build> 
+1

Perfect !!!!!!! –

+0

Dziękuję za odpowiedź bezpośrednią. Rozwiązałam wszystkie niejasne problemy, które miałem z wtyczką do montażu mavenów, bez marnowania czasu na próbę zrozumienia, dlaczego! –

+0

To działało idealnie dla mnie! Dziękuję Ci! – madx

2

onejar-maven-plugin pozwala rozwiązać Maven i wiosna sprzeczność tworząc pojedynczy plik słoik z zależnościami. Tworzy owijkę wokół pliku jar, umieszczając ją w innym słoiku (jednym słoiku).

<plugin> 
      <groupId>org.dstovall</groupId> 
      <artifactId>onejar-maven-plugin</artifactId> 
      <version>1.4.4</version> 
      <executions> 
       <execution> 
       <goals> 
        <goal>one-jar</goal> 
       </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>your.package.App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

<!-- outside build tag in pom.xml --> 
<pluginRepositories> 
     <pluginRepository> 
      <id>onejar-maven-plugin.googlecode.com</id> 
      <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
     </pluginRepository> 
</pluginRepositories> 
0

Oprócz rozwiązania zamieszczonych przez @GrampaJohn, miałem również, aby upewnić się, że opakowanie było wymagane biblioteki w generowanym pliku JAR zamiast wydobycia ich do wygenerowanego JAR.

w Eclipse Marsie, po wprowadzeniu zmian do pom.xml (dodany Maven-cienia wtyczek jak sugeruje @GrampaJohn), wykonaj następujące kroki:

File -> Export -> Select Java folder ->Runnable JAR File -> enter the Launch configuration (main file), export destination, and in Library Handling, select "Package required Libraries into generated JAR -> Click finish

.

Powiązane problemy