我有一个使用 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 的次要版本略有不同,代码也不应该像这样中断。有谁明白这里有什么问题?