2010-02-16 85 views
4

我在我的服务器上运行批处理作业时出现问题,而在我的开发工作站上,它运行良好。为什么初始化Spring时出现NullPointerException

我已经使用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[email protected]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

+0

我建议看看DefaultListableBeanFactory.java,第103行。或者甚至更好,在那里放置一个断点。 –

+0

确保'applicationContext.xml'在服务器上就位。 – Bozho

+0

applicationContext位于$ CLASSPATH/META-INF/spring/applicationContext.xml中 至于设置断点,在我的服务器上运行时该怎么做?当我通过我的工作站上的IDE运行它时,没有任何错误 – niklassaers

回答

7

的问题的原因是-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

+0

非常感谢,为我解决了这个问题。但是,我回到了一个巨大的阶级路径!有没有办法保持我的classpath clutterfree,并仍然让我的程序正确执行? – niklassaers

+1

真的不需要担心类路径的样子。这只是一个传递给程序的参数。很少有人需要手动设置,大多数应用程序通过脚本或其他方法来处理它。 –

+1

这也可能是Rational Application Developer/Eclipse中的一个问题,您已将jar添加到标记为系统库的User Library中。真是一种解脱,我认为Spring肯定不会推出像RAD这样的春季测试框架,这在RAD中不起作用......原来这是我的问题。 –

0

只需将jar添加到引用的库,而不是用户库。它为我工作!

2

线程“main”中的异常java.lang.ExceptionInInitializerError在添加用户库时发生。我在休眠春天以及面临同样的问题。所以我删除用户库说“春天”然后我手动添加罐子它完美的工作。

1

在Eclipse:

如果您使用的是spring jars作为用户库(说SpringLib),看看春天的用户库是added(or checked)为系统库(添加到启动类路径)。如果是的话,remove的复选标记.`

相关问题