Como saber de qual jar uma classe foi carregada

Este é um post técnico, sobre Java. Se que costuma vir aqui querendo saber a respeito da minha vida ou buscando resumo de livros pode estranhar um pouco.

Vou colocar esta dica aqui para evitar que outras pessoas tenham o mesmo problema que eu tive no meu trabalho. Quem achou este código foi o meu amigo Marcos Toledo, enquanto me ajudava com meu problema.

O problema que tinha era descobrir de qual jar uma classe java estava sendo carregada. No meu caso eu havia colocado uma classe C, com um novo método M dentro de um jar J.

Acontece que quando eu executava minha aplicação eu recebia um “NoSuchMethodError”, pois não era possível localizar o método M dentro da classe C.

Se eu coloquei o método na classe e a minha aplicação disse que não achou, era óbvio que ela estava olhando no lugar errado. Estava sendo carregada uma classe C de um lugar onde ela (por desatualização) não tinha o método M. Mas onde?

Usando as linhas de código abaixo, consegui descobrir de qual arquivo jar a classe C estava sendo carregada. Eis o código:

Class cls = MyFoo.class;
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();
System.out.println(loc);
// imprime algo como “c:/jars/MeuJar.jar”

Fazendo isso descobri que minha classe estava sendo carregada de um arquivo J.jar_BKP, que era um backup da versão anterior do arquivo, antes de eu adicionar o método M na classe.

Isso tudo só ocorreu pois o JBoss, atrevido, abre qualquer arquivo para ver o que tem dentro. Eu achei que ele só abriria o .jar, mas ele abre o .BKP, ou qualquer outra coisa que você colocar na extensão.

E como arquivos .BKP, estão na frente os .JAR na ordem alfabética, ele carregava primeiramente a classe desatualizada.

Mas no fim deu tudo certo.

Sugiro que você construa uma classe utilitária, com métodos estáticos, para que possa chamar este código em qualquer parte da sua aplicação sempre que precisar.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: