【问题标题】:ClassCastException -- Error on Redhat, not on WindowsClassCastException -- Redhat 上的错误,而不是 Windows 上的错误
【发布时间】:2011-10-04 15:30:02
【问题描述】:

我的网站在 Tomcat 上运行。当我尝试访问我的一个页面进行状态检查时,它会检查特定的 JAR 文件。在 Red Hat 5 上,但不是在 Windows 上,我收到以下错误:

java.lang.ClassCastException: LoggingPasshashInfo cannot be cast to PasshashInfo

我从第三方那里获得了这个 JAR,并且正在使用它。根据 Apache 的 tatus 页面,RH 设置在 Tomcat 版本 7.0.22 和 JVM 版本 1.6.0_27-b07 上。 Windows 在 Tomcat 7.0.19 和 JVM 1.6.0_26-b03 上。 Red Hat 的 Tomcat 在尝试修复此问题的过程中从 6.0.33 升级。

无论如何,我对此有点陌生,除了让设置看起来尽可能相似之外,我不知道如何解决这个问题。任何帮助都可以,如果我未能分享任何重要细节,请告诉我。重申一下,我正在使用的 JAR 是一个黑盒子。

完全错误:

Java.lang.ClassCastException: com.adobe.adept.fulfillment.test.LoggingPasshashInfo cannot be cast to com.adobe.adept.fulfillment.PasshashInfo
    at com.adobe.adept.fulfillment.servlet.Fulfill.<clinit>(Fulfill.java:130)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:127)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:836)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 我猜测包含这两个类中的一个或另一个的 JAR 文件在两个系统上是不同的。或者您可能有两个包含相同类的 JAR 文件,并且它们在类路径中的顺序基本上是相反的。
  • 在 Daniel 的带领下:1) 这个库是多平台的吗? 2)如果不是,您是否确保仅打包特定于操作系统的 jar?
  • 我最初在 Windows 上下载了单个 JAR,并首先让它在那里工作。然后我通过本地网络将它转移到 RH。这不会弄乱 JAR 的内容,对吗?这两个类都应该在那个 JAR 中,尽管 com.adobe.adept.fulfillment.servlet.Fulfill 不是。
  • Paolo,我刚看到你的评论。这绝对是我必须研究的事情,因为......好吧,我有点认为它会起作用,因为我使用的其他 JAR 在 Unix 和 Windows 之间似乎没有问题。

标签: java apache tomcat redhat


【解决方案1】:

我怀疑您在 Linux 服务器上安装了多个 jar 文件的副本。这样做的结果可能是同一个 jar 被多个类加载器加载。通常相关但由不相关的类加载器加载的类不能通过强制转换进行转换。仔细检查 jar 文件的其他副本——例如,在 Tomcat 的顶级“server/lib”目录中——并删除除一个以外的所有副本。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2021-05-19
    • 2016-12-25
    • 2012-10-11
    相关资源
    最近更新 更多