2010-07-26 3 views
15

Ich erstelle eine eigenständige Sava-Anwendung mit Spring, um den JDBC-Zugriff zu behandeln. Die Anwendung funktioniert bei jedem Test einwandfrei und ich entschied, dass ich ein Glas brauche, um unsere Kunden einzusetzen.Noch ein weiteres "nicht in der Lage, Spring NamespaceHandler zu finden" Fehler

Sie haben möglicherweise Spring nicht in ihrem Klassenpfad, also habe ich Maven-Assembly-Plugin verwendet, um die JAR-Erstellung mit Abhängigkeiten zu behandeln.

aber wenn ich versuche, um die Anwendung auszuführen:

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

Welche der folgenden Fehler führt:

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. 

Die applicationContext.xml Datei ist in project/src/main/resources. Und es wird auf der Ziel-/Paketnamen-Basis platziert.

Die 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> 

Das ist alles, was ich denken kann, dass nützlich sein könnte. Ich werde mehr Informationen zur Verfügung stellen, wenn angefordert.

+0

Der Fehler impliziert fehlende Header innerhalb der applicationContext.xml. Bitte posten Sie diese Datei, oder zumindest die Header- und Root-Elemente und einige Beispiele. –

Antwort

8

Ich fand den Fehler, der Fehler liegt in einem unfixed bug in the maven-assembly plugin. Ich habe die folgende Problemumgehung verwendet:

Zuerst auskommentiert die Maven-Assembly-Code in meinem Pom. Dann kopierte ich die Abhängigkeiten zu einem lib Ordner auf dem Ziel mit der Maben-Abhängigkeit-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> 

Dann habe ich die Maven-jar-Plugin, um meinen Setup ausführbaren jar:

 <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> 

Schließlich ich habe ein bash-Skript, das mit der Anwendung bereitgestellt wird, die meine app mit libs und alle vorgesehenen Argumente lautet:

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

ich sollte die App in python gebaut =/

4

Sieht aus wie ein Fehler in der Maven Assembly Plugin - MASSEMBLY-360, und wie in diesem Blog-Eintrag here diskutiert.

Kurz gesagt, die Meta-Dateien in den Spring-JARs, die die Spring-Namespaces behandeln, werden von Maven manipuliert.

29

Ich stieß heute mit dem Maven-Assembly-Plugin auf dieses Problem. Eine Suche brachte mich zu dieser Frage, und ein Blick auf den Fehlerbericht legte nahe, dass ich vielleicht das falsche Plugin benutzt habe. Also wechselte ich zum maven-shade-plugin. Soweit ich weiß, funktioniert es perfekt. Ich habe eine ausführbare Jar, die eine Reihe von Spring-Module sowie Apache MQ enthält. Hier ist das entsprechende Bit von meinem 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

Perfekt !!!!!!! –

+0

Vielen Dank für eine klare Antwort. Dies löste all die obskuren Probleme, die ich mit dem maven-assembly-plugin hatte, ohne dass ich tagelang versuchen musste zu verstehen warum! –

+0

Das hat perfekt für mich funktioniert! Vielen Dank! – madx

2

onejar-Maven-Plugin Sie Maven und Feder Widerspruch durch eine einzige JAR-Datei erstellen mit Abhängigkeiten auflösen kann. Es erstellt einen Wrapper um Ihre JAR-Datei, indem Sie sie in ein anderes JAR (Ein-JAR) legen.

<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

Neben der Lösung von @GrampaJohn geschrieben, hatte ich auch dafür zu sorgen, dass ich die erforderlichen Bibliotheken wurde die Verpackung in der generierte JAR-Datei, anstatt sie in die generierte JAR extrahieren.

in Eclipse Mars, nach Änderungen der pom.xml (hinzugefügt Maven-Schatten-Plugin wie @GrampaJohn vorgeschlagen) zu machen, folgen Sie den Schritten:

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

.

Verwandte Themen