4.2.5. Depuração e Resolução dos ClassCastExceptions

Os ClassCastExceptions acontecem com frequência uma vez que a classe está sendo carregada por um carregador de classe que eles estendem. Eles podem também ser o resultado da mesma classe existente em JARs múltiplos.

Procedimento 4.10. 

  1. Busque pelo aplicativo para encontrar todos os JAR(s) que contém a classe nomeada pelo ClassNotFoundException. Caso exista um módulo definido para a classe, encontre e remova os JAR(s) duplicados a partir do WAR ou EAR do aplicativo.
  2. Encontre o módulo do JBoss contendo a classe e defina claramente a dependência no arquivo MANIFEST.MF ou no arquivo jboss-deployment-structure.xml. Refira-se ao Class Loading and Subdeployments no capítulo Class Loading and Modules do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ para maiores informações.
  3. Caso você não esteja apto a resolver isto usando as etapas acima, você pode normalmente determinar a causa do problema imprimindo a informação do carregador da classe ao log. Por exemplo, você observará o seguinte ClassCastException no log:
    java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
    1. No seu código, imprima a informação do carregador das classes nomeados pelo ClassCastException ao log, por exemplo:
      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. A informação no log apresenta quais módulos são carregados nas classes e, baseado no seu aplicativo, você precisa remover ou mover os JAR(s) em conflito.