Pergunta

Estamos implantando um arquivo WAR no Tomcat 5.5 e ele funciona muito bem se WEB-INF \ classes contém arquivos .classes, mas se mover o arquivo .jar que contém essa .classes em WEB-INF \ lib, temos um exceção em tempo de execução reclamando que java.lang.NoSuchMethodError, mas arquivo de classe existente no arquivo .jar contém a classe e método faz saídas!

Qualquer ajuda sobre este seria apreciada.

Foi útil?

Solução

Isso pode ser causado devido a um conflito de classes. Certifique-se de que não há uma versão mais antiga do lugar Class (pasta compartilhada do Tomcat, WEB-INF / classes, WEB-INF / lib). Se este for o caso, você praticamente não pode saber qual classe Tomcat irá carregar. Se ele pega um sem o método, a exceção que você está experimentando irá ocorrer.

Outras dicas

Uma vez que você está recebendo um NoSuchMethodError, e não um ClassNotFoundError, isso significa que você tem uma versão antiga do lugar da classe (fora do arquivo jar). Você precisa encontrar e removê-lo.

Esta é defently classe closin dê uma olhada aqui http: //tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

Como você pode ver, há uma prioridade maior para as classes em WEB-INF / classes comparando WEB-INF / lib. Você tem as duas classes com o mesmo nome (e pacote). Quando um deles é nas classes pasta que tem maior prioridade. quando ambos estão na pasta lib, em seguida, o segundo um obter primeiro (frascos têm uma prioridade com base em sua ordem alfa-BETICAL)

Isto pode explicar a sua situação.

Hope isso ajuda - Yonatan

A partir da perspectiva de uma aplicação web, de classe ou de recursos de carregamento procura nos seguintes repositórios, nesta ordem:

classes Bootstrap da sua JVM
aulas carregador classe System (descrito acima)
/ WEB-INF / classes de sua aplicação web
/WEB-INF/lib/*.jar de sua aplicação web
aulas de carregador de classe comum (descritos acima)

Os locais pesquisados ??por "carregador de classe comum" são definidos pela propriedade common.loader em $ CATALINA_BASE / conf / catalina.properties. Isto é onde nós ativar / definir local de compartilhamento;
shared.loader = $ {catalina.base} / shared / classes, $ {catalina.base} / shared / lib / *. jar

E a ordem acima dá mais visão para o problema que você enfrentou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top