先说背景:
- WindowsXP 和 OpenSUSE SLED 11.0 上的 Tomcat 6.0(两个平台上的结果相同)
- 甲骨文 JDK v6
- 春天 3.0
- Javolution 5.5.1
我的应用程序正在使用的 jar (javolution-5.5.1.jar) 有一个奇怪的问题。我已经在 WEB-INF/lib 中有这个 jar 一段时间了,没有任何问题。我们确定这个 jar 确实需要在 Tomcat 的 lib 目录而不是我们应用的 lib 目录中,因为它在多个应用之间共享,所以我们移动了它。
但是,这样做会导致新的 RuntimeException 尝试访问从 javolution.jar 扩展 Struct 的类 (Scinv)。是否有某种原因,应用程序无法以这种方式从 Tomcat 的 lib 目录访问 JAR 中的类?
我的课是(删除了不相关的细节):
import javolution.io.Struct;
public class Scinv extends Struct {
public static methodA() {...}
public static methodB() {...}
public static class ProdRecs extends Struct {...}
public static class ProdRec extends Struct {...}
}
当我尝试访问使用静态嵌套类的 Scinv 的静态方法时,我得到了这个:
Apr 5, 2011 3:40:50 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet inventory threw exception
java.lang.RuntimeException: Struct class: general.dao.externalfiles.Scinv$ProdRec not found
at javolution.io.Struct.array(Struct.java:557)
at general.dao.externalfiles.Scinv$ProdRecs.<init>(Scinv.java:447)
Apr 5, 2011 3:40:50 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.RuntimeException: Struct class: general.dao.externalfiles.Scinv$ProdRec not found
at javolution.io.Struct.array(Struct.java:557)
at general.dao.externalfiles.Scinv$ProdRecs.<init>(Scinv.java:447)
我所要做的就是将 javolution-5.5.1.jar 从 Tomcat/lib 移动到我的 WEB-INF/lib 目录,应用程序再次正常工作,没有 RuntimeExceptions。
关于为什么失败的任何想法?我们在 Tomcat/lib 目录中也有 postgres-9.0.jar 文件,它似乎工作正常。
如果您需要,我很乐意提供更多详细信息,任何建议都将不胜感激,因为我对这个有点难过!