【问题标题】:Can a servlet truly access jars in Tomcat's lib dir?servlet 可以真正访问 Tomcat 的 lib 目录中的 jars 吗?
【发布时间】:2011-04-05 21:18:52
【问题描述】:

背景优先:

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

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

【问题讨论】:

  • 好的,如果你重启tomcat,它是否可以正确启动而不会抛出异常?日志说什么?
  • 我重启了 Tomcat 几次都没有用。我已经添加了我在上面看到的所有日志消息。顺便说一句,它总是启动得很好,只有当我尝试访问 Scinv 时它才会抛出 RuntimeException。

标签: java tomcat jar javolution


【解决方案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) 中的构造函数发生了什么?某些原因导致对象无法初始化,从而导致运行时异常。

【讨论】:

  • 我认为你正朝着正确的方向前进。 Javolution 库正在对类进行一些缓存并在内部管理类加载器,现在我认为我的问题更多在于库本身。我将继续研究这一点并将发布我的结果。
  • 状态更新:原来这个问题是库本身造成的。正如我所说,它试图在内部进行类加载,并且它使用的算法是无效的。因此,我在 Scinv$ProdRecs 中的构造函数因 RuntimeException 而失败。非常感谢 SO 引导我朝着这个方向前进!
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2016-01-06
  • 2021-06-30
  • 2012-02-26
  • 2018-09-22
  • 2013-07-31
相关资源
最近更新 更多