我有一个使用 Jetty 部署的 Java Web 应用程序(使用 Spring)。如果我尝试在 Windows 机器上运行它,一切都按预期工作,但如果我尝试在我的 Linux 机器上运行相同的代码,它会失败,如下所示:
【正常启动输出】
11:16:39.657 INFO [main] org.mortbay.jetty.servlet.ServletHandler$Context.log>(ServletHandler.java:1145) >16> 设置 Web 应用根系统属性:'webapp.root' = [/path/到/工作/目录]
java.lang.reflect.InvocationTargetException
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在 java.lang.reflect.Method.invoke(Method.java:597)
在 org.mortbay.start.Main.invokeMain(Main.java:151)
在 org.mortbay.start.Main.start(Main.java:476)
在 org.mortbay.start.Main.main(Main.java:94)
引起:java.lang.ExceptionInInitializerError
在 org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:129)
在 org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:51)
在 org.mortbay.jetty.servlet.WebApplicationContext.doStart(WebApplicationContext.java:495)
在 org.mortbay.util.Container.start(Container.java:72)
在 org.mortbay.http.HttpServer.doStart(HttpServer.java:708)
在 org.mortbay.util.Container.start(Container.java:72)
在 org.mortbay.jetty.Server.main(Server.java:460)
... 7 更多
引起:org.apache.commons.logging.LogConfigurationException:org.apache.commons.logging.LogConfigurationException:没有合适的日志构造函数[Ljava.lang.Class;@15311bd for org.apache.commons.logging.impl.Log4JLogger(引起by java.lang.NoClassDefFoundError: org/apache/log4j/Category) (由 org.apache.commons.logging.LogConfigurationException 引起:没有合适的日志构造函数 [Ljava.lang.Class;@15311bd 用于 org.apache.commons.logging。 impl.Log4JLogger(由 java.lang.NoClassDefFoundError: org/apache/log4j/Category 引起))
在 org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
在 org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
在 org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
在 org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
在 org.springframework.util.SystemPropertyUtils.(SystemPropertyUtils.java:42)
... 14 更多
引起:org.apache.commons.logging.LogConfigurationException:没有合适的日志构造函数 [Ljava.lang.Class;@15311bd for org.apache.commons.logging.impl.Log4JLogger(由 java.lang.NoClassDefFoundError 引起:org/apache /log4j/类别)
在 org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:413)
在 org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
... 18 更多
引起:java.lang.NoClassDefFoundError: org/apache/log4j/Category
在 java.lang.Class.getDeclaredConstructors0(本机方法)
在 java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
在 java.lang.Class.getConstructor0(Class.java:2699)
在 java.lang.Class.getConstructor(Class.java:1657)
在 org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:410)
... 19 更多
引起:java.lang.ClassNotFoundException:org.apache.log4j.Category
在 java.net.URLClassLoader$1.run(URLClassLoader.java:200)
在 java.security.AccessController.doPrivileged(本机方法)
在 java.net.URLClassLoader.findClass(URLClassLoader.java:188)
在 java.lang.ClassLoader.loadClass(ClassLoader.java:307)
在 java.lang.ClassLoader.loadClass(ClassLoader.java:252)
在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 24 更多
[关机输出]
我已经使用 运行了该应用程序java -verbose:class,根据该输出,org.apache.log4j.Category 是从我的 /WEB-INF/lib 中的 log4j JAR 加载的,就在引发第一个异常之前。
现在,两台机器上的 Java 版本略有不同。两台机器都有 Sun 的 java,Linux 机器有 1.6.0_10,而 Windows 机器有 1.6.0_08,或者可能是 07 或 06,我现在不记得确切的数字,并且手头没有机器. 但即使 Java 的次要版本略有不同,代码也不应该像这样中断。有谁明白这里有什么问题?