Olá
Daniel, não passei por este problema. Mas quiz chamar a atenção para o fato de que com arquivos ear se pode usar a mesma classe sem problemas. Aliás, este é o único meio que conheço de colocar a mesma classe duas vezes na mesma aplicação sem dar pau. Acho que esta é uma das perguntas mais dificeis que se pode fazer a algum candidato a guru em Java:
[color=blue]É possível colocar a mesma classe mais de uma vez em uma aplicação Java? Se acha que sim diga como.[/color]
[color=green]Resposta: Sim, empacotando a aplicação em um arquivo ear e localizando as classes corretamente no arquivo manifest.[/color]
Resumo:
Carregar classes ou class loading é o processo de localizar os bytes de uma classe e converter em instâncias Java dentro da JVM. É um processo feito pela JVM desde a inicialização e depois por ClassLoaders subclasses de java.lang.ClassLoader. Isto permite carregar as classes independente de onde seus bytes estão armazenados tanto local como remotamente e ainda permitir gerar classes dinamicamente. Os ClassLoaders também carregam métodos nativos tais como arquivos .dll (ou .so).
Um classloader é uma subclasse de java.lang.ClassLoader que é responsável pelo carregamento das classes. Em uma aplicação Java pode haver diferentes classloaders usando mecanismos diferentes para carregar as classes. Os classloaders podem carregar as classes oriundas de diversas fontes tais como base de dados, servidor remoto, file system, fontes definidas em arquivo xml, código fonte a ser compilado, etc.
Cada classloader (uma instância de uma subclasse de ClassLoader) define um único e separado namespace. Em cada classloader somente uma classe com um determinado nome pode existir. Mas a mesma classe pode ser carregada por diferentes classloaders. Neste caso a JVM considerará cada classe como qualificada pela instância do ClassLoader que a carregou. Em outras palavras, o nome completo de uma classe consiste do seu nome mais seu classloader.
Porém carregar duas vezes a mesma classe pode ser fonte de bugs dificeis de serem descobertos.
“Daniel”:
O Deploy foi ok…
Mas na hora do EJB (do CGE) ser executado pelo GPA, ocorre ClassCastException nesta linha:
GPAProcessoAssincronoHome home = (GPAProcessoAssincronoHome) PortableRemoteObject.narrow(o, GPAProcessoAssincronoHome.class);
Ou seja, ele entende as Interfaces Home duplicadas como diferentes.
Toda tentativa de fazer cast de um objeto por outro (por exemplo durante a localização JNDI) resultará em ClassCastException.
Para entender melhor toda a questão dos classloaders normais é fundamental ler o capítulo 2 do livro do Stuart Haloway que indiquei antes. Mas para entender classloaders com J2EE há um excelente artigo que no caso do Daniel é de leitura obrigatória:
[color=red]Class Loading in J2EE and Oracle9iAS Environments (Bryan Atsatt e Debu Panda)[/color]
http://otn.oracle.com/oramag/oracle/02-sep/o52oc4j.html
Além do uso do parametro -verbose:class na linha de comando do Java, se pode debugar classloaders usando dicas do artigo do JavaWorld
Back to your Class roots, continued (Vladimir Roubtsov)
Um outro artigo sobre este assunto:
http://www.onjava.com/pub/a/onjava/2003/11/12/classloader.html
Espero ter ajudado (sem ter lido seu código)
[]s
Luca