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

痞子三分冷 提交于 2019-11-27 03:54:12

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>

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

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

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.

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!