Problems com Arquivos JAR e ClassLoaders

4 respostas
K

Olá a todos, estou tendo um sério problema com relação a ClassLoaders. É o seguinte, eu gostaria de carregar dinamicamente alguns JARs. Para isso, gerei esse código baseado na API do Java:

import java.net.*;

public class Loader
{
	public Loader()
	{
		try
		{
			URL [] locations = new URL[1];

			locations[0] = new URL("jar:file://./Teste.jar!/");

			ClassLoader loader = URLClassLoader.newInstance(locations, this.getClass().getClassLoader());

			Class c = loader.loadClass("TesteClasse");
		}

		catch (ClassNotFoundException e)
		{
			System.out.println("Exception (ClassNotFoundException): " + e.getMessage());
		}

		catch (MalformedURLException e)
		{
			System.out.println("Exception (MalformedURLException): " + e.getMessage());
		}
	}

	public static void main(String [] args)
	{
		new Loader();
	}
}

Ele carrega o JAR normalmente, mas quando eu tendo carregar alguma classe desse JAR, dá sempre a excessão ClassNotFoundException. Já tentei os caminhos:

URL location = new URL(“jar:file://./Teste.jar!/”);
URL location = new URL(“jar:file://C:/loader/Teste.jar!/”);

Aparentemente, parecia ser problema do JAR, mas já coloquei o “Teste.jar” no Classpath do Java e consigo abrir normalmente.

Não sei mais o q fazer, pode ser pau na instalação do Java, sei lá.

O que pode estar acontecendo?

Abraços;

4 Respostas

Marky.Vasconcelos

Mas voce precisa passar o nome completo da classe pro loadClass… não teria a declaração do pacote nessa classe?

andrepestana

kompiler,

dê uma olhada nessa classe:
http://www.koders.com/java/fid894799955B05CDB99DD226AA14B191C87F401EB6.aspx

depois para usá-la:

File f = new File("c:\jModuleTest.jar"); // Arquivo jar que vc quer adicionar ao classpath
			
ClassPathHacker.addFile(f);
		
Class clazz = Class.forName("com.test.JMduleTest"); // classe que vc quer instanciar
		
Object obj = clazz.newInstance();
String s  = (String) clazz.getMethod("getTestResponse", null).invoke(obj, null);

Abraço,

K

Consegui resolver o problema sozinho, e obrigado aqueles que responderam.

Mark_Ameba, não estou usando pacotes no programa, pois o exemplo é bem básico.

andrepestana, dei uma olhada no link, obrigado pela ajuda, apesar de não resolver o meu problema.

A solução foi simples, o problema era na URL. Fiz alguns testes para ver o problema. Usei a classe File para armazenar o JAR:

File jar = new File("arquivo.jar");

URl url = jar.toURL();

System.out.println(url.toString());

Com isso, peguei a URL que a classe File me retornava e comparei com a URL que eu estava criando. E digo uma coisa, num tem nada a ver, Veja o resultado:

  • URL feito por mim:

“jar:file://C:/loader/Teste.jar!/”

  • URL retornada pela classe File:

“file:Teste.jar”

Como podem ver, a diferença é grande, mas o problema básico é o seguinte: Não se pode usar “file://”, pois dá pau na hora de carregar a classe. Há duas soluções:

1 - Usar somente file:caminho_para_o_jar.jar
2 - Adicionar mais uma /, como em file:///caminho_para_o_jar.jar

Sobre usar a diretiva jar: antes do file, é irrelevante, se usar, fica obrigado a usar !/ depois do fim da URL

Obrigado a todos e até a próxima…

Marky.Vasconcelos

Só mais uma… o método toURL() da classe File esta depreciado. Em seu lugar use toURI().toURL().

Criado 19 de janeiro de 2009
Ultima resposta 26 de jan. de 2009
Respostas 4
Participantes 3