web-dev-qa-db-fra.com

Impossible de localiser Spring NamespaceHandler pour l'espace de noms de schéma XML [http://www.springframework.org/schema/batch]

Situation

J'utilise Spring Batch pour créer un instantané cumulatif pour notre entrepôt de données et je rencontre un problème de configuration que je n'arrive pas à comprendre.

J'ai créé un projet Spring Batch simple avec STS (SpringSource Tool Suite 2.8.1) à l'aide du projet de modèle Spring . Voici mes deux fichiers de configuration XML créés:

launch-context.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:batch="http://www.springframework.org/schema/batch"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="
    http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
    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">

<context:property-placeholder location="classpath:batch.properties" />

<context:component-scan base-package="edu.kdc.visioncards" />

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>

<batch:job-repository id="jobRepository" />

<import resource="classpath:/META-INF/spring/module-context.xml" />

et module-context.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:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<description>Example job to get you started. It provides a skeleton for a typical batch application.</description>

<batch:job id="job1">
    <batch:step id="step1"  >           
        <batch:tasklet transaction-manager="transactionManager" start-limit="100" >
            <batch:chunk reader="reader" writer="writer" commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job> 

</beans>

Problème

J'exécute la commande suivante pour compiler et conditionner le projet: mvn clean compile install

alors je fais comme suit:

  1. cd à cible dossier

  2. Exécutez le travail via CommandLineJobRunner: Java -jar batchprimer-1.0.jar META-INF/spring/module-context.xml job1

et j'obtiens l'erreur suivante:

C:\stsworkspace\BatchPrimer\target>Java -jar batchprimer-1.0.jar META-INF/spring
/module-context.xml job1
2011-12-15 12:03:53,421 INFO [org.springframework.context.support.ClassPathXmlAp
plicationContext] - <Refreshing org.springframework.context.support.ClassPathXml
ApplicationContext@84abc9: startup date [Thu Dec 15 12:03:53 EST 2011]; root of
context hierarchy>
2011-12-15 12:03:53,468 INFO [org.springframework.beans.factory.xml.XmlBeanDefin
itionReader] - <Loading XML bean definitions from class path resource [META-INF/
spring/module-context.xml]>
2011-12-15 12:03:53,796 ERROR [org.springframework.batch.core.launch.support.Com
mandLineJobRunner] - <Job Terminated in error: Configuration problem: Unable to
locate Spring NamespaceHandler for XML schema namespace [http://www.springframew
ork.org/schema/batch]
Offending resource: class path resource [META-INF/spring/module-context.xml]
>
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Config
uration problem: Unable to locate Spring NamespaceHandler for XML schema namespa
ce [http://www.springframework.org/schema/batch]
Offending resource: class path resource [META-INF/spring/module-context.xml]

        at org.springframework.beans.factory.parsing.FailFastProblemReporter.err
or(FailFastProblemReporter.Java:68)
        at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderC
ontext.Java:85)
        at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderC
ontext.Java:80)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.er
ror(BeanDefinitionParserDelegate.Java:284)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.pa
rseCustomElement(BeanDefinitionParserDelegate.Java:1335)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.pa
rseCustomElement(BeanDefinitionParserDelegate.Java:1328)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentRe
ader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.Java:135)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentRe
ader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.Java:93)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registe
rBeanDefinitions(XmlBeanDefinitionReader.Java:493)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadB
eanDefinitions(XmlBeanDefinitionReader.Java:390)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.Java:334)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.Java:302)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:143)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:178)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:149)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:212)
        at org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.Java:126)
        at org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.Java:92)
        at org.springframework.context.support.AbstractRefreshableApplicationCon
text.refreshBeanFactory(AbstractRefreshableApplicationContext.Java:130)
        at org.springframework.context.support.AbstractApplicationContext.obtain
FreshBeanFactory(AbstractApplicationContext.Java:467)
        at org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.Java:397)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.Java:139)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.Java:83)
        at org.springframework.batch.core.launch.support.CommandLineJobRunner.st
art(CommandLineJobRunner.Java:282)
        at org.springframework.batch.core.launch.support.CommandLineJobRunner.ma
in(CommandLineJobRunner.Java:574)

Trucs supplémentaires

Dans le dossier cible qui a été rempli avec la commande mvn install, j'ai les éléments suivants:

  1. A classes dossier
  2. un dossier lib avec toutes mes dépendances maven
  3. a maven-archiver dossier
  4. a test-classes dossier
  5. a batchprimer-1.0.jar

Dans le pot, dans le META-INF/MANIFEST.MF . J'ai comme suit:

Manifest-Version: 1.0

Archiver-Version: Plexus Archiver

Created-By: Apache Maven

Built-By: dpardo

Build-Jdk: 1.6.0_20

Main-Class: org.springframework.batch.core.launch.support.CommandLineJ
 obRunner

Class-Path: lib/spring-jdbc-3.0.6.RELEASE.jar lib/spring-beans-3.0.6.R
 ELEASE.jar lib/spring-core-3.0.6.RELEASE.jar lib/spring-asm-3.0.6.REL
 EASE.jar lib/commons-logging-1.1.1.jar lib/spring-tx-3.0.6.RELEASE.ja
 r lib/aopalliance-1.0.jar lib/spring-aop-3.0.6.RELEASE.jar lib/spring
 -context-3.0.6.RELEASE.jar lib/spring-expression-3.0.6.RELEASE.jar li
 b/cglib-nodep-2.2.jar lib/spring-batch-core-2.1.7.RELEASE.jar lib/spr
 ing-batch-infrastructure-2.1.7.RELEASE.jar lib/xstream-1.3.jar lib/xp
 p3_min-1.1.4c.jar lib/jettison-1.1.jar lib/commons-io-1.4.jar lib/com
 mons-dbcp-1.2.2.jar lib/commons-pool-1.3.jar lib/hsqldb-1.8.0.7.jar l
 ib/aspectjrt-1.6.8.jar lib/aspectjweaver-1.6.8.jar lib/log4j-1.2.14.j
 ar lib/slf4j-log4j12-1.5.8.jar lib/slf4j-api-1.5.8.jar lib/mysql-conn
 ector-Java-5.1.3.jar

Donc, je ne pense pas que ce soit un problème de chemin de classe, car dans la console, il semble que l'on trouve les fichiers jar.

Ce que j'ai essayé

Sur la base de l'erreur, j'ai collé l'URL suivante 

http://www.springframework.org/schema/batch/

et l'adresse des espaces de noms pour Spring Batch semble être correcte. Je n'ai rien trouvé d'utile ni là-bas. J'ai lu quelque part que "quelque chose" pouvait être supérieur aux espaces de noms des fichiers mais je ne comprenais pas vraiment pourquoi, quoi et/ou comment le résoudre.

Ceci est juste hors de la boîte et déjà ne fonctionne pas sans avoir fait aucune modification, ajouts ou quoi que ce soit. Des idées? 

Merci

SOLUTION

En plus de la solution indiquée comme correcte ci-dessous. Je devais également modifier le fichier launch-context.xml de la numérisation des composants en un câblage à ressort standard, comme ci-dessous:

<!-- Commented this 
<context:property-placeholder location="classpath:batch.properties" />  


<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>
-->
<!-- Replace it with this below -->
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${batch.jdbc.driver}" />
    <property name="url" value="${batch.jdbc.url}" />
    <property name="username" value="${batch.jdbc.user}" />
    <property name="password" value="${batch.jdbc.password}" />
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    lazy-init="true">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="placeholderProperties"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:batch.properties" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="order" value="1" />
</bean>
12
Viriato

Exécutez le travail via CommandLineJobRunner: Java -jar Batchprimer-1.0.jar META-INF/spring/module-context.xml

même avec un dossier cible complet, vous devez fournir les informations de chemin d'accès aux classes pour la commande Java , pour faciliter la configuration, vous pouvez l'essayer avec un jar exécutable tout-en-un, par exemple. avec maven-shade-plugin ou un script Shell exécutable (.bat/.sh) avec toutes les bibliothèques nécessaires, par ex. avec appassembler-maven-plugin

exemple de configuration de maven-shade-plugin (crée un fichier jar supplémentaire):

<plugin>
    <!-- create an all-in-one executable jar with maven-shade-plugin
         bound to phase:package 
         special handling for spring.handlers/spring.schemas files
         to prevent overwriting (maven-shade-plugin joins them to
         one file) 

         usage:
         cd to <project>/target
         Java -jar hello-world-Java-1.0-SNAPSHOT-executable.jar spring/batch/job/hello-world-job.xml helloWorldJob
         -->                     
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</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>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <!-- configures the suffix name for the executable jar
                     here it will be '<project.artifact>-<project.version>-executable.jar'-->
                <shadedClassifierName>executable</shadedClassifierName>
            </configuration>
        </execution>
    </executions>
</plugin>

exemple de configuration d'appassembleur (crée une structure de sous-dossiers et .bat/.sh):

<plugin>
    <artifactId>appassembler-maven-plugin</artifactId>
    <groupId>org.codehaus.mojo</groupId>
    <version>1.1.1</version>
    <configuration>
        <repositoryLayout>flat</repositoryLayout>
        <installArtifacts>false</installArtifacts>
        <target>${project.build.directory}/appassembler</target>
        <defaultJvmSettings>
            <initialMemorySize>512M</initialMemorySize>
            <maxMemorySize>1024M</maxMemorySize>
            <extraArguments>
                <extraArgument>-Dlog4j.configuration=../etc/log4j/log4j.properties</extraArgument>
            </extraArguments>
        </defaultJvmSettings>
        <configurationDirectory>etc</configurationDirectory>
        <daemons>
            <daemon>
                <id>applicationName</id>
                <mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</mainClass>
                <commandLineArguments>
                    <commandLineArgument>spring/job-runner.xml</commandLineArgument>
                    <commandLineArgument>helloWorldJob</commandLineArgument>
                    <commandLineArgument>input.file.pattern=file:.../**/*.txt</commandLineArgument>
                </commandLineArguments>
                <platforms>
                    <platform>booter-unix</platform>
                    <platform>booter-windows</platform>
                </platforms>
            </daemon>
        </daemons>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>generate-daemons</goal>
                <goal>create-repository</goal>
            </goals>
        </execution>
    </executions>
</plugin>
28
Michael Pralow

J'utilisais la version 3.X.X du lot de ressorts et d'autres versions de dépendances de printemps 4.X.X et j'ai reçu l'erreur ci-dessus. Après quelques essais et erreurs, j'ai constaté que le maintien de toutes les versions de printemps similaires corrigeait mon problème. Vous suggérons donc soit d’utiliser la version 3.X.X du lot de spring, soit de vous rendre à la version de dépendance de spring pour spring-jdbc et de spring-tx à 2.X.X.

Cordialement, Rave

1
Ravikiran763

Vous avez besoin du fichier spring-batch.jar sur votre chemin de classe d'exécution. Il fournit un gestionnaire d’espace de noms capable de gérer cet espace de noms spécifique.

0
Bozho

L'erreur est due au fait que le fichier META-INF/spring.handlers dans spring-batch-core-2.1.7.RELEASE.jar n'est pas visible. Ce fichier contient

http\://www.springframework.org/schema/batch=org.springframework.batch.core.configuration.xml.CoreNamespaceHandler

Cela ressemble soit à un problème de chemin de classe, soit au fichier spring.handlers des autres fichiers JAR (Spring-Context, par exemple) est prioritaire.

0
Emerson Farrugia

Dans mon cas, il manquait simplement la dépendance de la transaction de printemps - ou peut-être une ancienne. En remplaçant cela par 3.1, l'erreur a disparu.

0
Albert Mendonca