0

先说背景:

  • 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 文件,它似乎工作正常。

如果您需要,我很乐意提供更多详细信息,任何建议都将不胜感激,因为我对这个有点难过!

4

1 回答 1

1

我不认为将 javolution-5.5.1.jar 放在TOMCAT_HOME/lib文件夹中是问题,JVM 会担心该Struct对象已经(javolution.io.Struct.array(Struct.java:557))。问题的真正原因是:general.dao.externalfiles.Scinv$ProdRecs类 ( Scinv.java:447) 中的构造函数发生了什么?某些原因导致对象未初始化,因此导致运行时异常。

于 2011-04-05T21:47:03.057 回答