NoSuchMethodError muito estranho... [RESOLVIDO]

Olá a todos,

estou precisando de uma ajuda:

tenho uma classe que instancia um objeto de uma classe vinda de um jar que está adicionado ao classpath do linux.

No ambiente da minha máquina, com o Eclipse, tudo funciona corretamente.

Porém quando eu subo pra produção ele simplesmente dá o seguinte erro:

Exception in thread "main" java.lang.NoSuchMethodError: <pacote>.Classe1.metodo() <pacote>.Classe2.metodo();

aonde:
.Classe2.metodo() ativa dentro dele o método .Classe1.metodo()

(nao posso informar as classes pq é confidencial o codigo).

Nao eh um erro de ausencia da classe main pois nao se trata de um método executável.

Eu fui no servidor, peguei o jar aonde está a Classe1 (descompilei o .class com o JavaDecompiler) e vi que o método que eu chamo está lah sim.

A referencia estah certa, pois o jar da Classe1 estah no class path do linux e eu chamo este class path após o do Java.

O que pode ser? Alguem tem uma idéia?

Obrigado.

Ola,
Qual é o application server que você está executando? Jboss?
Pode ser que exista uma outra classe com o mesmo nome em outro pacote e a mesma não possua o método que você está tentando executar.
Algo como br.teste.Classe1, ai o classloader pode estar se perdendo na hora de carregar as classes.
Abs

Olá Diogo,

sim eh o JBoss, mas nao, nao existe esta classe duplicada, mesmo se houvesse nao teria problema pq o método que está sendo procurado nela é chamado em outras aplicações e funfa perfeitamente…

Sinceramente, minhas possibilidades de idéias do que pode estar acontecendo estao se esgotando…

Bom, mas brigadão pela ajuda!

NoSuchMethodError indica fortemente que existe conflito de versoes de jars (possivelmente de dependencias).

Por exemplo, voce esta compilando seu codigo no eclipse com hibernate 3.2, mas no jboss esta o hibernate 3.1.

Um exemplo mais dificil de pegar: Voce esta compilando tudo corretamente com hibernate entity manager 3.3, e com hibernate core 3.2.5. Na hora de compilar da tudo certo, mas na hora de executar, o hibernate entity manager 3.3 precisa do hibernate core 3.2.6 (exemplo), e o 3.2.5 ta faltando um metodo que seria invocado! Compilar, compila, pois voce invocou a JPA.

Sempre quis escrever um post sobre isso. NoSuchMethodError sempre indica carregamento errado de classes ou versoes de jar.

Olá Paulo,

concordo com você, na maioria das pesquisas que eu realizei na internet NoSuchMethodError fazia referencia apenas a ausencia do método main. O pessoal nao explorou a fundo este cara.

Bem, sua idéia faz sentido, olhando no blog da caelum ( http://blog.caelum.com.br/2007/12/17/java-6-as-apis-de-xml-webservices-e-classloaders/ ) tem um trecho que está assim:

[quote]Um outro problema comum é com o JAXB: o Java 6 vem com a versão 2.0, se você precisar usar a 1.1 ou a 2.1, vai ter problemas. O interessante é que a JAXB do Java SE já foi projetada para ela mesma detectar se o classloading foi correto, ou se partiu de uma versão posterior/anterior a ela, mostrando uma mensagem de erro amigável. Para outras bibliotecas esse problema pode ser muito sutil: o classloader pode acabar carregando parte da biblioteca de uma versão recente, já que algumas classes novas só existem nesse jar, e o restante de uma outra antiga, resultando exceptions como NoSuchMethodError, que não mostram claramente que o problema é a existência de dois jars de versões diferentes no classpath daquela aplicação.

Podemos ver que mesmo seguindos boas práticas, isolando bibliotecas e não usando a terrível variável de ambiente CLASSPATH, acabamos sempre enfrentando o classloader hell.[/quote]

E na aplicação que está dando o problema, o JAXB é utilizado, logo eu imagino que o erro seja que o JAR que eu chamo o método esteja repetido em alguma pasta lib ou do tomcat, dou do jboss… algo assim e esteja dando um conflito e o erro nao estah aparecendo claramente.

Vou continuar investigando e obrigado pela idéia, como disse as minhas se esgotaram agora e a sua foi de grande utilidade.

Abraços

Olá a todos,

consegui resolver o problema. vejam o que eu fiz:

o método .Classe2.metodo(); tinha como retorno um ByteArrayInputStream, contudo eu nao utilizava o objeto de retorno para absolutamente nada, eu simplesmente nao precisava do retorno, apenas da execucao do método então eu só chamava o método e pronto.

Daí eu criei um objeto e joguei o return do método para ele:

ByteArrayInputStream arrayInputStream = classe2.metodo(); arrayInputStream = null; // pra nao ocupar memória desnecessária

Compilei e executei no ambiente de produção chamando o JBoss e funcionou.

Não sei descrever ao certo o que houve ou como isso solucionou o problema mas resolveu. Infelismente, como na nossa profissão tudo é pra ontem não estou com tempo para pensar nestes porques… apesar de querer, mas acho que já ajudo bastante pelo menos documentando aqui no fórum o que eu fiz pra resolver o problema.

Espero poder ajudar a outros que venham a ter o mesmo problema.

Abraços

opa… valeo ai Glauber e Paulo Silveira

Estava com o Mesmo problema, e reslvi limpando uns jars de versões antigoas ( q substitui por de novas versões)

Agora sim, vamos indo a luta.

até mais :slight_smile:

hey, galera, ressucitei esse tópico porque estou tendo um problema com NoSuchMethodError e não to sabendo como resolver (mudei o nome do pacote, da classe e do método para simplificar):

java.lang.NoSuchMethodError: br.meuPacote.MinhaClasse.setAtributoAntigo(Ljava/util/Date;)V

Começei a obter esse erro depois fiz algumas alterações na classe MinhaClasse (adicionei alguns métodos e atributos e removi outros). O método setAtributoAntigo(Date date) foi removido dessa classe e não é mais chamado de nenhum ponto da aplicação, no entanto fico obtendo esse erro quando executo um comando que cria um objeto de MinhaClasse.

Será que alguém pode dar uma “luz” nesse caso? :smiley:

Não creio que seja problema com algum .jar, porque a classe foi definida por mim e aplicação estava funfando legal antes que eu fizesse as alterações

é uma aplicação web, estou usando eclipse helios, e tomcat 7

valeu

[quote=Rafael Nascimento]hey, galera, ressucitei esse tópico porque estou tendo um problema com NoSuchMethodError e não to sabendo como resolver (mudei o nome do pacote, da classe e do método para simplificar):

java.lang.NoSuchMethodError: br.meuPacote.MinhaClasse.setAtributoAntigo(Ljava/util/Date;)V

Começei a obter esse erro depois fiz algumas alterações na classe MinhaClasse (adicionei alguns métodos e atributos e removi outros). O método setAtributoAntigo(Date date) foi removido dessa classe e não é mais chamado de nenhum ponto da aplicação, no entanto fico obtendo esse erro quando executo um comando que cria um objeto de MinhaClasse.

Será que alguém pode dar uma “luz” nesse caso? :smiley:

Não creio que seja problema com algum .jar, porque a classe foi definida por mim e aplicação estava funfando legal antes que eu fizesse as alterações

é uma aplicação web, estou usando eclipse helios, e tomcat 7

valeu[/quote]

Quando ocorreu este erro, eu estava com o meu servidor aberto, no caso o Jetty.

Como tinha adicionado um método e o servidor estava aberto, ele não reconhecia o método, era necessário reiniciar o servidor a fim de re-compilar as classes.

Reiniciando o servidor foi possível resolver o meu problema :smiley: