복붙노트

[SPRING] XML 스키마 네임 스페이스 용 Spring NamespaceHandler를 찾을 수 없음 [http://www.springframework.org/schema/batch]

SPRING

XML 스키마 네임 스페이스 용 Spring NamespaceHandler를 찾을 수 없음 [http://www.springframework.org/schema/batch]

스프링 벅 (Spring Batch)을 사용하여 데이터웨어 하우스 용 누적 스냅 샷을 구축하고 있으며 파악할 수없는 구성로드 블록이 있습니다.

스프링 템플리트 프로젝트를 사용하여 STS (SpringSource Tool Suite 2.8.1)로 간단한 스프링 배치 프로젝트를 만들었습니다. 다음은 만든 두 xml 구성 파일입니다.

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

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

다음 명령을 실행하여 프로젝트를 컴파일하고 패키지화합니다. mvn clean compile install

그럼 나는 다음과 같이한다 :

다음 오류가 발생합니다.

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)

mvn install 명령으로 채워진 대상 폴더에는 다음과 같은 내용이 있습니다.

항아리 안의 META-INF / MANIFEST.MF. 나는 다음과 같이있다 :

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

그래서 나는 그것이 클래스 패스 문제라고 생각하지 않는다. 왜냐하면 콘솔에서 항아리를 찾는 것처럼 보이기 때문이다.

오류를 기반으로 다음 URL을 붙여 넣었습니다.

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

Spring Batch의 네임 스페이스 주소가 정확하다고 보입니다. 나는 밖에서 유용한 것도 발견하지 못했습니다. 나는 "무언가"가 파일의 네임 스페이스를 오버라이드 할 수 있지만 어째서 그것을 왜, 왜, 어떻게 해결하는지 이해하지 못했다.

이것은 상자 밖의 것으로, 수정, 부가 기능 등을 수행하지 않고 이미 작동하지 않습니다. 어떤 아이디어?

감사

아래에 올바른 해결 방법으로 표시되어 있습니다. 또한 launch-context.xml을 구성 요소 스캐닝에서 다음과 같이 일반적인 스프링 배선으로 변경해야했습니다.

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

해결법

  1. ==============================

    1.완전한 대상 폴더가있는 경우에도 java 명령에 클래스 경로 정보를 제공해야 구성을 쉽게 할 수 있습니다. 복합기 실행 파일 jar로 시도해 볼 수 있습니다. maven-shade-plugin 또는 실행 가능한 쉘 스크립트 (.bat / .sh)를 사용하여 필요한 모든 라이브러리 (예. appassembler-maven-plugin을 사용하여

    완전한 대상 폴더가있는 경우에도 java 명령에 클래스 경로 정보를 제공해야 구성을 쉽게 할 수 있습니다. 복합기 실행 파일 jar로 시도해 볼 수 있습니다. maven-shade-plugin 또는 실행 가능한 쉘 스크립트 (.bat / .sh)를 사용하여 필요한 모든 라이브러리 (예. appassembler-maven-plugin을 사용하여

    maven-shade-plugin 예제 설정 (추가 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>
    

    예제 appassembler 구성 (하위 폴더 구조 및 .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>
    
  2. ==============================

    2.스프링 배치 버전 3.X.X 및 기타 스프링 의존성 버전 4.X.X를 사용하고 위의 오류가 발생했습니다. 몇 번의 시행 착오 끝에 모든 스프링 버전을 비슷하게 유지하면 내 문제가 해결된다는 것을 알게되었습니다. 그러므로 스프링 배치 버전 3.X.X를 사용 하시거나 spring-jdbc 용 spring dependecy 버전과 2.X.X 용 spring-tx 버전을 사용 하시길 권합니다.

    스프링 배치 버전 3.X.X 및 기타 스프링 의존성 버전 4.X.X를 사용하고 위의 오류가 발생했습니다. 몇 번의 시행 착오 끝에 모든 스프링 버전을 비슷하게 유지하면 내 문제가 해결된다는 것을 알게되었습니다. 그러므로 스프링 배치 버전 3.X.X를 사용 하시거나 spring-jdbc 용 spring dependecy 버전과 2.X.X 용 spring-tx 버전을 사용 하시길 권합니다.

    안부, 레이브 Logged

  3. ==============================

    3.런타임 클래스 경로에서 spring-batch.jar이 필요합니다. 특정 네임 스페이스를 처리 할 수있는 네임 스페이스 처리기를 제공합니다.

    런타임 클래스 경로에서 spring-batch.jar이 필요합니다. 특정 네임 스페이스를 처리 할 수있는 네임 스페이스 처리기를 제공합니다.

  4. ==============================

    4.이 오류는 spring-batch-core-2.1.7.RELEASE.jar의 META-INF / spring.handlers 파일이 보이지 않아서 발생합니다. 이 파일에는

    이 오류는 spring-batch-core-2.1.7.RELEASE.jar의 META-INF / spring.handlers 파일이 보이지 않아서 발생합니다. 이 파일에는

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

    classpath 문제이거나 다른 JAR (예 : 스프링 컨텍스트)의 spring.handlers 파일과 같이 보이는 것이 어떻게 든 우선 순위를 갖습니다.

  5. ==============================

    5.제 경우에는 스프링 트랜잭션 의존성을 잃어 버렸거나 오래된 트랜잭션을 가리키고있었습니다. 이를 3.1로 대체하면 오류가 사라집니다.

    제 경우에는 스프링 트랜잭션 의존성을 잃어 버렸거나 오래된 트랜잭션을 가리키고있었습니다. 이를 3.1로 대체하면 오류가 사라집니다.

  6. from https://stackoverflow.com/questions/8523997/unable-to-locate-spring-namespacehandler-for-xml-schema-namespace-http-www-sp by cc-by-sa and MIT license