Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/batch]

后端 未结 5 1932
抹茶落季
抹茶落季 2020-11-30 03:16

Situation

I am using Spring Batch to build an Accumulative Snapshot for our Data Warehouse and I am having a configuration roadblock that I cannot figure out.

<
相关标签:
5条回答
  • 2020-11-30 04:03

    Run the job through CommandLineJobRunner: java -jar batchprimer-1.0.jar META-INF/spring/module-context.xml job1

    even with a complete target folder you have to provide the classpath information for the java command, to ease the configuration you can try it with an all-in-one executable jar e.g. with maven-shade-plugin or an executable shell script (.bat/.sh) with all needed libraries, e.g. with appassembler-maven-plugin

    maven-shade-plugin example configuration (creates additional jar):

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

    example appassembler configuration (creates subfolder structure and .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>
    
    0 讨论(0)
  • 2020-11-30 04:04

    In my case it was simply missing the spring transaction dependency - or perhaps pointing to an old one. Replacing that with 3.1 took the error away.

    0 讨论(0)
  • 2020-11-30 04:05

    You need the spring-batch.jar on your runtime classpath. It provides a namespace handler that is capable of handling that specific namespace.

    0 讨论(0)
  • 2020-11-30 04:12

    I was using spring batch version 3.X.X and other spring dependencies versions 4.X.X , and received the above error. After some trial and error I found that maintaining all the spring versions similar fixed my issue. Hence suggest you to either use spring batch version 3.X.X or make you spring dependecy version for spring-jdbc and spring-tx to 2.X.X

    Regards, Rave

    0 讨论(0)
  • 2020-11-30 04:19

    The error is caused because the META-INF/spring.handlers file in spring-batch-core-2.1.7.RELEASE.jar isn't being seen. This file contains

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

    It looks like either a classpath problem or like the spring.handlers file in the other JARs (spring-context, e.g.) is somehow taking precedence.

    0 讨论(0)
提交回复
热议问题