Conflito de libraries: javax.mail com geronimo-javamail_1.4_spec-1.2.jar

6 respostas
bigjoe

[color=darkblue]Pessoal, saudações!

Estou com um problema e sem idéias de como resolvê-lo.

Recentemente, nosso projeto incluiu o Axis2 para dar suporte a WebServices e usamos o Apache Axiom para compor as mensagens SOAP. Até aqui, tudo bem. Usamos o JBOSS como AppServer.

Porém, quando tivemos que implementar uma rotina de envio de emails, descobrimos um comportamento estranho: os emails eram enviados sem mime headers e tampouco iam com o campo subject preenchido, mesmo que, durante o debug da classe utilitária para esse fim, eles fossem corretamente montados.

Depois de dias de testes e análises, descobrimos que, quando retirávamos a lib geronimo-javamail_1.4_spec-1.2.jar, o email funcionava corretamente. Porém, o Axiom do Apache usa essa lib, estando declarada no pom.xml dela.

Abrindo o jar do geronimo-javamail_1.4_spec-1.2.jar, descobrimos que dentro dela existe o javax.mail, o que deve estar confundindo o JBOSS. Se removo o diretório javax/mail de dentro do jar, a aplicação funciona bem, tanto o envio de emails quanto o WebService.

Porém, nossa filosofia é usar o maven para automatizar e um processo que dependa de edição manual de um arquivo jar é absolutamente contra essa idéia!

Os colegas têm alguma sugestão de como posso resolver essa questão ?

Passos executados até o momento:

  1. Remoção da dependência javax.mail do pom.xml da minha aplicação, mas o javax.mail é dependência de outras libs e é buscado do repositório. Resultado: negativo
  2. Edição manual do arquivo geronimo-javamail_1.4_spec-1.2.jar para remoção do package embutido do javax.mail. Resultado: positivo, porém contrário às boas práticas

Um grande abraço,

Joe![/color]

6 Respostas

rodrigousp

Desculpe… eu não compreendi direito.
Você está falando que usa o jar de email do geronimono Jboss… acho que isso não está muito certo não… :roll:

Seu projeto não deveria apontar para o jar de mail do próprio Jboss e não o jar o geronimo?

bigjoe

[color=darkblue]Perdão, eu revisei o texto umas três vezes antes de enviar e ainda assim deixei-o confuso demais. Sorry. :slight_smile:

O projeto originalmente feito em cima do Spring e do Hibernate precisou da adição de um Web Service. Nós baixamos o Axis 2 versão 1.2.7 e construímos as mensagens SOAP usando o Apache AXIOM.

Depois da implementação, resolveu-se que o sistema iria enviar emails de aviso das transações via Web Service. Para isso, baixei o javax.mail.

Só que, quando o email era enviado, apesar de ser corretamente montado (vi através de debugging), o que chegava para os destinatários era um email sem o campo assunto e com todos os acentos e caracteres ascii truncados. Porém, a mesma classe, quando acionada através de um método main dentro de si mesma, enviava o email de forma correta.

Depois de muito fuçar, descobrimos que o Axis2 e o AXIOM dependem de uma lib chamada geronimo-javamail_1.4_spec-1.2.jar - o maven a baixa automaticamente.

Analisando essa referida library, vimos que dentro dela contém uma implementação de javax.mail. Removemo-na do pacote WAR da aplicação e o email passou a funcionar sem problemas e o Web Service não teve problemas. Logo, concluímos que essa lib não está sendo usada pelo sistema e poderia ser eliminada.

Mas como fazer isso ? Teríamos duas opções, ao nosso ver:

  1. configurar o maven para não baixar essa lib que interfere com nosso projeto
    ou
  2. Informar ao class loading do JBOSS para usar a nossa classe de javax-mail

Mas eu não sei fazer nem um nem outro.

A versão de javax.mail que usamos é 1.4 e a embutida dentro de geronimo-javamail_1.4_spec-1.2.jar é a mesma.

Quando tentamos usar o serviço de email do JBOSS, tivemos problema de ClassCastException, derivado de problemas de isolamento das classes, que também não soube fazer nem achei informações para aplicar num pacote WAR.

Nós conseguimos resolver o problema reduzindo a versão tanto do Axis2 quanto do AXIOM, até um ponto em que nenhum desses frameworks tivesse dependência de geronimo-javamail_1.4_spec-1.2.jar.

Mas continuo querendo entender esse mecanismo. Aceito recomendações de literatura. De tudo o que li, o que mais achei específico em relação ao meu problema foi:

http://wiki.jboss.org/wiki/ClassLoadingConfiguration
http://wiki.jboss.org/wiki/JBossClassLoadingUseCases
http://wiki.jboss.org/wiki/ClassLoadingOverview
http://wiki.jboss.org/wiki/GetClassNotFoundExceptionOrNoClassDefFoundError

Se o texto continuou confuso, por favor me fale, para que eu possa clarificá-lo. :slight_smile:

Muito obrigado pela ajuda,

Joe[/color]

rodrigousp

Eu não conheço Maven muito bem… mas vou falar de um problema que costumo resolver no eclipse.

Procure utilizar as mesmas bibliotecas que o servidor de aplicação usa. Se você procurar no servidor de aplicação encontrará os jar para uma série de recursos como o javax.mail. O Jboss tem um pacote, Jboss-all-client que já vem como um monte dessas bibliotecas. Sugiro fortemente utilizá-lo.

O eclipse WTP fornece uma lista de servidores pré-configurados. O ideal é utilizar a library (tem uma opção library na janela do classpath do eclipse) do servidor de aplicação que você está utilizando. Usar outras bibliotecas é certeza de encontrar problemas.

Como eu disse, eu não lembro muito bem do Maven mas tente configurá-lo para utilizar as bibliotecas do JBoss.
Se isso não tiver nada a ver então eu não entendi hehehe… sorry.

[]´s

bigjoe

Resumindo, meu amigo, o problema pode ser descrito como: eu queria usar a lib javax.mail e dois frameworks que uso (Axis2 e AXIOM) têm, nas suas dependências, um jar que encapsula uma implementação de javax.mail (geronimo-javamail_1.4_spec-1.2.jar).

E o JBOSS está se perdendo nisso :frowning:

Como disse, o problema está resolvido através do downgrade da versão dos frameworks, mas eu gostaria de saber mais do assunto para resolvê-lo de forma correta, porque pode ser que da próxima vez não possamos usar esse truque :smiley:

Obrigado pelo seu tempo e pelas suas respostas!

Abraços,

Joe

victorwss

bigjoe:
Resumindo, meu amigo, o problema pode ser descrito como: eu queria usar a lib javax.mail e dois frameworks que uso (Axis2 e AXIOM) têm, nas suas dependências, um jar que encapsula uma implementação de javax.mail (geronimo-javamail_1.4_spec-1.2.jar).

E o JBOSS está se perdendo nisso :frowning:

Como disse, o problema está resolvido através do downgrade da versão dos frameworks, mas eu gostaria de saber mais do assunto para resolvê-lo de forma correta, porque pode ser que da próxima vez não possamos usar esse truque :smiley:

Obrigado pelo seu tempo e pelas suas respostas!

Abraços,

Joe

Uma solução seria substituir o jar errado por um jar vazio. Desta forma ele vai achar as classes certas no JAR certo do classpath e não vai estragar as dependências.

Outra forma é você editar os jars do seu framework e mexer nas dependências deles manualmente, fazendo apontar para o jar correto.

O classpath é uma das maiores dores de cabeça no java por conta disso. Não há uma forma simples de se resolver problemas de classes duplicadas.

L

Só pra agradecer! Estava com esse mesmo problema, e só foi tirar o geronimo…jar que funcionou!

Valeus!

Criado 8 de agosto de 2008
Ultima resposta 28 de out. de 2008
Respostas 6
Participantes 4