servlet可以真正访问Tomcat的lib目录中的jar吗?

时间:2011-04-05 21:18:53

标签: java tomcat jar javolution

背景优先:

  • WindowsXP上的Tomcat 6.0& OpenSUSE SLED 11.0(两个平台上的结果相同)
  • Oracle JDK v6
  • Spring 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文件,它似乎工作正常。

如果您需要,我很乐意提供更多详细信息,任何建议都会受到赞赏,因为我有点难过!

1 个答案:

答案 0 :(得分: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)中的构造函数发生了什么?有些东西导致对象不能初始化,因而也就是运行时异常。