4.2.5. 调试和解决 ClassCastExceptions


ClassCastException 通常是类被不同于它扩展的类加载器加载而引起的,它也可能是因为在多个 JAR 里存在相同的类而引起的。
  1. 搜索应用程序来查找包含 ClassCastException 里命名的类的所有 JAR。如果为这个类定义了模块,请从应用程序的 WAR 或 EAR 里查找并删除重复的 JAR。
  2. 找到包含这个类的 JBoss 模块并显性地在 MANIFEST.MF 文件或 jboss-deployment-structure.xml 文件里定义依赖关系。关于更多的信息,请查看 https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ 上的《JBoss EAP 6 部署指南》里『类加载和模块』章节中的『类加载和子部署』
  3. 如果您无法使用上面的步骤解决这个问题,您可以将类加载器的信息输出到日志里确定原因。例如,您可以在日志里看下列 ClassCastException
    java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
    1. 在您的代码里,将 ClassCastException 里出现的类的类加载信息输出到日志。例如:
      logger.info("Class loader for CustomClass1: " + 
            com.example1.CustomClass1.getClass().getClassLoader().toString());
      logger.info("Class loader for CustomClass2: " + 
            com.example2.CustomClass2.getClass().getClassLoader().toString());
      
    2. 日志里的信息显示了哪些模块在加载类,且您需要根据您的应用程序删除或移走冲突的 JAR。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.