我在我的服务器上运行批处理作业时遇到问题,而它在我的开发工作站上从 Eclipse 运行良好。
我已经使用 Roo 设置了我的 Spring 环境,创建了一个实体,并制作了一个可以做一些工作的批处理,并在我的开发箱上很好地测试它。我初始化我的上下文并完成工作,但是当我在服务器上运行我的批处理时,上下文没有正确初始化。这是代码:
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 运行的,所以我相信我的配置文件没有问题,但是我该如何调试导致这种情况的原因呢?也许我有一些配置错误或服务器和开发工作站之间的不匹配?或者这是说找不到文件的一种非常奇怪的方式,如果是这样,我如何确保它找到正确的文件?
我真的很期待听到您关于如何解决这个问题的建议。
干杯
尼克
最佳答案
问题的原因是 -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:因此,使用
-classpath
(明确指定所有 jars)而不是 -Djava.endorsed.dirs