Ler arquivo java dentro do jar

5 respostas
rmoraes

Olá pessoal,
Preciso ler um arquivo jar e retirar o código java do mesmo para analise. Estou criando o meu arquivo jar com os fontes junto, para a leitura dos mesmos posteriormente. Como o meu jar não está no classpath, como posso fazer isso.

Passo como parametro para o método readTextFromJar a classe que desejo analisar “com/br/textread/Reader.java”, mas o retorno do getResourceAsStream() da linha 10 retorna null.

public static List<String> readTextFromJar(String s) { 
		InputStream is = null; 
		BufferedReader br = null; 
		String line; 
		ArrayList<String> list = new ArrayList<String>(); 
		
		try { 
			is = ExtractSourceJava.class.getResourceAsStream(s); 
			br = new BufferedReader(new InputStreamReader(is)); 
			while (null != (line = br.readLine())) { 
				list.add(line); 
			} 
		} catch (Exception e) { 
			e.printStackTrace(); 
		} finally { 
			try { 
				if (br != null) 
					br.close(); 
				if (is != null) 
					is.close(); 
			} catch (IOException e) { 
				e.printStackTrace(); 
			} 
		} 
		return list; 
	}

alguém sabe o que pode estar errado.

5 Respostas

T

Note que “com/br/textread/Reader.java” é diferente de “/com/br/textread/Reader.java”. Será que você não está precisando pôr a barra?

rmoraes

Era isso aí mesmo, muito obrigado.

rmoraes

Mais uma questão, isso funciona somente quando o jar está no classpath do meu projeto, mas a intenção é selecionar um jar qualquer para ler os arquivos internos. Existe uma forma de fazer isso?

T

Se você não criar um classloader para ler esse jar (usualmente com java.net.URLClassloader), então você pode usar (com um bocadinho de trabalho) as classes java.util.zip.ZipInputStream e ZipFile. Se você criar um classloader, pode usar o getResourceAsStream mesmo.

(Existem as classes JarInputStream e JarFile, mas a única diferença delas com ZipInputStream e ZipFile é que as classes JarAlgumaCoisa dão acesso ao manifest, que normalmente não é o que você precisa. No seu caso é melhor usar as classes mais simples ZipFile e ZipInputStream.)

rmoraes

Muito obrigado pela dica, vou tentar isso mesmo.

Criado 23 de setembro de 2008
Ultima resposta 24 de set. de 2008
Respostas 5
Participantes 2