12 de abr. de 2011

Debug do Classloader no Weblogic

É comum ao tentarmos fazer o deploy de uma aplicação recebermos um erro de ClassNotFoundException. Este é o tipo de erro bem chato de descobrir e algumas vezes temos certeza que a classe está presente no lib do domínio ou disponível para aplicação de alguma forma, seja como shared lib ou no classpath do servidor direto. E então o que fazer, como pode estar acontecendo de a classe COM CERTEZA estar disponível e mesmo assim a exceção de ClassNotFound estar ocorrendo? Bem, nesse caso é bastante útil fazer o classloader ficar em modo verbose para vermos direitinho quais as classes e em que ordem o weblogic está carregando-as.

Para fazer isso basta adicionarmos como parâmetro de JVM do servidor desejado o seguinte:

-Dweblogic.utils.classloaders.FilteringClassLoader.Verbose


Feito isso ao reiniciarmos o servidor iremos ver o classloader aparecendo para cada classe que for procurada, neste formato:

...
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) weblogic.jndi.WLInitialContextFactory
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) weblogic.jndi.factories.java.javaURLContextFactory
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) com.bea.common.security.store.data.String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) com.bea.common.security.store.data.String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) com.bea.common.security.store.data.String
[FilteringClassLoader] : **** FilteringClassLoader ... findClass(..) String
...


Com o debug do classloader fica bem mais fácil entender e descobrir a causa do ClassNotFoundException e com isso solucionar o problema.
Fica também uma dica, caso seja necessário pode-se inverter o classloader da aplicação web para que o weblogic utilize como preferenciais os .jar empacotados no lib do seu .war, para isso basta colocar a seguinte configuração no weblogic.xml da sua aplicação:

...
    
        true
    
...


[]s

7 de abr. de 2011

Migração do Projeto Seam para rodar no Weblogic 10.X - Parte 2

Este post dá continuidade a uma série de posts que estou escrevendo sobre a migração de um projeto que utilize JBoss Seam para rodar em weblogic, estou usando neste caso o Weblogic 10.3.3

O que me motivou a fazer este post é que a documentação oficial do JBoss Seam tem um capítulo sobre o Weblogic mas em todas as vezes que tentei seguí-la não obtive sucesso. Então segue o que fiz com as devidas alterações para que funcionasse.

A primeira parte deste post que cobre a criação do projeto com JBoss Seam pode ser encontrada neste link:

http://mmaiacupofcoffee.blogspot.com/2010/05/jboss-seam-criacao-de-projeto.html

Seguindo os passos do projeto criado no link acima temos então um projeto do Seam padrão, o próximo passo é importá-lo no eclipse para alterarmos o que for necessário. Eu utilizei uma versão do Eclipse Helios com JBoss Tools, se precisar de uma referência veja este post.

1) Criação do arquivo weblogic.xml - para este primeiro passo basta criar um arquivo chamado weblogic.xml no mesmo diretório onde está o web.xml


    10.3.3
    seam_weblogic



2) Mudar os arquivos persistence-prod.xml e persistence-dev.xml para funcionar com o weblogic, segue o meu persistence-dev.xml, para o prod fazer as alterações normais necessárias relativas ao banco de dados, criação de tabelas, etc..


             
   
      org.hibernate.ejb.HibernatePersistence
      seam_weblogic_ds
      
         
         
         
         
         
         
         
         
      
   
    



3) No web.xml registrar o seguinte listener:

  com.sun.faces.config.ConfigureListener



4) Mudar no build.xml o default target para archive e complementar as libs a serem copiadas pro pacote conforme fragmento abaixo:


...

    
        
        
        
        
        
         
        
        
        
        
        
        
        
        
             
        
        
        
             
        
        
        
        
        
        
        
    
 



Feito isso basta navegar em um console para a raiz do projeto e executar o ant default mesmo:
ant

Isso irá criar o war compatível com weblogic no diretório dist do seu projeto. Este .war é compatível com weblogic e vc pode fazer o deploy pelo console normalmente ou se o seu weblogic estiver no modo de desenvolvimento simplesmente copiar este arquivo para o diretório autodeploy do seu domínio.

Em alguns casos percebi a necessidade de inverter o classloader do weblogic, se no passo acima vc ainda não conseguir rodar vc pode tentar inverter o classloader do weblogic.

Este é o procedimento que funcionou no meu caso com .war gerado no seam. Não tentei e não recomendo utilização do Seam com EJBs no weblogic até este momento, por questões de estabilidade e aderência às especificações. Recomendo somente utilização do seam com pojos de camada web se for utilizá-lo com weblogic, mas se este for o seu caso vc encontra informações de como fazer isso na doc. oficial do Seam.

[]s