Acesso a pasta dentro de um arquivo .jar

11 respostas
H

Olá,
alguém pode me ajudar a resolver o seguinte problema:
Estou fazendo um plugin para o eclipse e preciso criar um
novo File de uma pasta dentro do jar que contem folhas de estilo
para listagem, Bem consigo criar um File da pasta mas quando
eu chamo o metodo listFiles() ele retorna null.
Aleguém sabe resolver este problema?
Por Favor me ajudem!
Obrigado!

ClassLoader cl = this.getClass().getClassLoader();
URL url = cl.getResource("com/stylesheets"); //Esta é a pasta
String s = url.toString();
		
File directory = new File(s);
File[] roots = directory.listFiles();

11 Respostas

B

Posta seu código.

H

Este é o codigo

ClassLoader cl = this.getClass().getClassLoader();
URL url = cl.getResource("com/stylesheets"); //Esta é a pasta
String s = url.toString();
		
File directory = new File(s);
File[] roots = directory.listFiles();
B

Talvez seja por 2 motivos:

1 - Na url recuperada, vem o protocolo que nesse caso é file:/

2 - Na url tem espaço, e ao invés de vir o caracter branco vem %20

Fiz um teste e para mim funcionou, substitua a linha abaixo

String s = url.toString();

por essa:

String s = (url.toString().substring(6, url.toString().length() - 1)).replaceAll("%20"," ");
T

Você não pode usar o File.listFiles para listar o que existe dentro de um arquivo jar. É necessário abrir o arquivo como um arquivo .zip, usando as classes do pacote java.util.zip, como ZipEntry e ZipInputStream.

B

É verdade, esqueci que o arquivo estava dentro de um jar.

Você pode utilizar a classe java.util.zip.ZipFile:

ZipFile file = new ZipFile("mysql-connector-java-5.1.7-bin.jar"); 
		ZipEntry entry;
		
		for(Enumeration i = file.entries(); i.hasMoreElements(); ) {
			entry = (ZipEntry) i.nextElement();
		
			System.out.println(entry.getName());
		}
H

amigo, não consigo fazer um novo JarFile usando getClass().getClassLoader.getResource(),
ao usar o caminho que ele renotorna para dar um new JarFile(“caminho”) ele retorna uma execeção
java.io.FileNotFoundException

URL url = cl.getResource("arquivo.jar");
JarFile jarFile = null;
try {
      jarFile = new JarFile(url.toExternalForm());
} catch (IOException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace(); //retorna: java.io.FileNotFoundException
}

tem alguma ideia sobre isso?
Obrigado!

B

“arquivo.jar” é o nome do Jar onde esta sua classe?

Oque te retorna o URL?

H

java.io.FileNotFoundException: bundleresource:\408\lib\arquivo.jar (A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta)
o nome e endereço correto é : lib/arquivo.jar
e o jar esta lá!
Obrigado!

B

Mas esse caminho não existe.

bundleresource:\408\lib\arquivo.jar

Eu fiz um teste aqui e funcionou, veja meu código abaixo e considere minhas observações quanto ao caminho com espaço e o protocolo no inicio da url:

URL url = this.getClass().getClassLoader().getResource("teste.jar");

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

    JarFile jarFile = null;
    try {
	jarFile = new JarFile(url.toExternalForm());
    } catch (IOException e1) {
	e1.printStackTrace(); // retorna: java.io.FileNotFoundException
    }

Saída:

file:/C:/Documents%20and%20Settings/btafarelo/Desktop/teste.jar
java.io.FileNotFoundException: file:\C:\Documents%20and%20Settings\btafarelo\Des
ktop\teste.jar (A sintaxe do nome do arquivo, pasta ou nome do volume estß incorreta)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at testes.MakeJar.<init>(MakeJar.java:20)
        at testes.MakeJar.main(MakeJar.java:10)

Teste.jar - É o jar onde minha classe esta.

file:/C:/Documents%20and%20Settings/btafarelo/Desktop/teste.jar - Esse é o caminho correto do meu jar

Mas é necessário substituir os %20 por espaço e remover o protocolo file:/

H

este caminho é o caminho retornado pelo:

URL url = getClass().getClassLoader().getResource("lib/arquivo.jar");
B

Estranho,

Fiz um teste um arquivo dentro da pasta lib e o caminho foi esse:

jar:file:/C:/Documents%20and%20Settings/btafarelo/Desktop/teste.jar!/lib/htmlunit-2.4.jar

Certinho e completo, bem diferente do seu.

Criado 19 de janeiro de 2009
Ultima resposta 20 de jan. de 2009
Respostas 11
Participantes 3