Почему я получаю исключение NullPointerException при инициализации Spring - PullRequest
4 голосов
/ 16 февраля 2010

У меня проблема с запуском пакетного задания на моем сервере, хотя оно отлично работает из Eclipse на моей рабочей станции.

Я настроил среду Spring с помощью Roo, создал сущность и создал пакет, который выполняет некоторую работу, и хорошо его протестировал на моем develompent box. Я инициализирую свой контекст и выполняю работу, но когда я запускаю свой пакет на сервере, контекст не инициализируется должным образом. Вот код:

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, проблем не возникает, но когда я развертываю его на сервере, где я хочу его запустить, и запускаю, как описано выше, я получаю эту проблему. Поскольку он запускается из Eclipse, я считаю, что с моими конфигурационными файлами все в порядке, но как я могу отладить, что вызывает это? Возможно, у меня есть ошибки конфигурации или несоответствие между сервером и рабочей станцией разработки? Или это действительно странный способ сказать, что файл не найден, и если да, то как мне убедиться, что он находит правильный файл ??

Очень жду ваших предложений о том, как решить эту проблему.

Приветствия

Nik

Ответы [ 4 ]

7 голосов
/ 16 февраля 2010

Причиной проблемы является -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.
    }
}

Это вызывает NullPointerException, потому что getClassLoader() возвращает null, когда класс загружается через -Djava.endorsed.dirs. Из Javadoc:

Некоторые реализации могут использовать null для представления загрузчика класса начальной загрузки.

Итак, используйте -classpath (с явным указанием всех банок) вместо -Djava.endorsed.dirs

2 голосов
/ 12 февраля 2014

Исключение в потоке "main" java.lang.ExceptionInInitializerError возникает при добавлении Пользовательской библиотеки . Я столкнулся с той же проблемой в Hibernate и Spring . Поэтому я удалил Пользовательскую библиотеку Скажите " Spring ", а затем я добавляю банки вручную, это отлично работает.

1 голос
/ 24 марта 2016

В Затмении:

Если вы используете spring jars в качестве пользовательской библиотеки (например, SpringLib), проверьте, является ли пользовательская библиотека для spring added(or checked) в качестве системной библиотеки (добавлена ​​в путь к загрузочному классу). Если да, remove галочка.

0 голосов
/ 13 декабря 2013

Просто добавьте jar в указанные библиотеки, а не в пользовательскую библиотеку. У меня это сработало!

...