복붙노트

[SPRING] Spring을 초기화 할 때 NullPointerException이 발생하는 이유는 무엇입니까?

SPRING

Spring을 초기화 할 때 NullPointerException이 발생하는 이유는 무엇입니까?

내 서버에서 배치 작업을 실행하는 데 문제가 있지만 개발 워크 스테이션에서는 Eclipse에서 제대로 실행됩니다.

Roo를 사용하여 Spring 환경을 설정하고, 엔티티를 만들고, 일을 처리하는 배치를 만들고, 내 develompent 상자에서 잘 테스트합니다. 컨텍스트를 초기화하고 작업을 수행하지만 서버에서 배치를 실행할 때 컨텍스트가 제대로 초기화되지 않습니다. 코드는 다음과 같습니다.

public class TestBatch {

    private static ApplicationContext context;


    @SuppressWarnings("unchecked")
    public static void main(final String[] args) {

            context = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext.xml");
            try {
                @SuppressWarnings("unused")
                TestBatch app = new TestBatch();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    }

    public void TestBatch() { /** Do Something using the context **/ }

}

로그와 예외는 다음과 같습니다.

2010-02-16 11:54:16,072 [main] INFO  org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6037fb1e: startup date [Tue Feb 16 11:54:16 CET 2010]; root of context hierarchy
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:127)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:458)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:388)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at tld.mydomain.myproject.batch.TestBatch.main(TestBatch.java:51)
Caused by: java.lang.NullPointerException
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.<clinit>(DefaultListableBeanFactory.java:103)
    ... 7 more

무슨 일이 일어나고 있는지에 대한 어떤 생각이나 암시가 있습니까? 내 클래스 경로는 $ PROJECTHOME / target / classes로 설정되어 있고 모든 의존성은 $ PROJECTHOME / target / lib에 있으며 "export CLASSPATH = $ PROJECTHOME / target / classes; java -Djava.endorsed.dirs = $ PROJECTHOME을 사용하여 실행합니다. / target / lib tld.mydomain.myproject.batch.TestBatch "

설치 과정에서 매우 잘못된 것처럼 보이는 것이 있습니까? Eclipse에서 이것을 실행할 때 아무런 문제가 없지만 위에서 설명한대로 실행하고 실행하려는 서버에 배포 할 때이 문제가 발생합니다. 이클립스에서 실행되기 때문에, 내 설정 파일이 괜찮을 거라 생각하지만, 어떻게이 문제의 원인을 디버깅 할 수 있습니까? 아마도 구성 오류가 있거나 서버와 개발 워크 스테이션간에 불일치가있을 수 있습니다. 아니면이 파일을 찾을 수없는 정말 이상한 방법입니다, 그렇다면, 어떻게 내가 올바른 파일을 찾았는지 확인합니까 ??

이 문제를 해결하는 방법에 대한 귀하의 제안을 정말로 기다리고 있습니다.

건배

해결법

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

    1.문제의 원인은 -Djava.endorsed.dirs = $ PROJECTHOME / target / lib입니다. org.springframework.beans.factory.support.DefaultListableBeanFactory는 다음 코드를 포함합니다 :

    문제의 원인은 -Djava.endorsed.dirs = $ PROJECTHOME / target / lib입니다. org.springframework.beans.factory.support.DefaultListableBeanFactory는 다음 코드를 포함합니다 :

    static {
        ClassLoader cl = DefaultListableBeanFactory.class.getClassLoader();
        try {
            javaxInjectProviderClass = cl.loadClass("javax.inject.Provider"); //Line 103
        }
        catch (ClassNotFoundException ex) {
            // JSR-330 API not available - Provider interface simply not supported then.
        }
    }
    

    -Djava.endorsed.dirs를 통해 클래스가로드 될 때 getClassLoader ()가 null을 반환하기 때문에 NullPointerException이 발생합니다. javadoc에서 :

    따라서 -Djava.endorsed.dirs 대신 -classpath (모든 jar를 명시 적으로 지정)를 사용하십시오.

  2. ==============================

    2.스레드 "main"의 예외 java.lang.ExceptionInInitializerError는 사용자 라이브러리를 추가하는 동안 발생합니다. 나는 Hibernate와 Spring에서도 같은 문제에 직면했다. 그래서 "Spring"이라고 말한 User Library를 제거한 다음 Jars를 수동으로 추가하면 완벽하게 작동합니다.

    스레드 "main"의 예외 java.lang.ExceptionInInitializerError는 사용자 라이브러리를 추가하는 동안 발생합니다. 나는 Hibernate와 Spring에서도 같은 문제에 직면했다. 그래서 "Spring"이라고 말한 User Library를 제거한 다음 Jars를 수동으로 추가하면 완벽하게 작동합니다.

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

    3.Eclipse에서 :

    Eclipse에서 :

    Spring Jars를 사용자 라이브러리 (SpringLib라고 말함)로 사용하는 경우 Spring 용 사용자 라이브러리가 시스템 라이브러리 (부트 클래스 경로에 추가됨)로 추가 (또는 선택)되었는지 확인하십시오. '예'인 경우 체크 표시를 제거하십시오 .`

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

    4.사용자 라이브러리가 아닌 참조 된 라이브러리에만 병을 추가하십시오. 그것은 나를 위해 일했다!

    사용자 라이브러리가 아닌 참조 된 라이브러리에만 병을 추가하십시오. 그것은 나를 위해 일했다!

  5. from https://stackoverflow.com/questions/2272354/why-do-i-get-a-nullpointerexception-when-initializing-spring by cc-by-sa and MIT license