Arquivo Jar não executa corretamente

4 respostas
AGAraujo

Boa noite.

meu arquivo jar, de nome teste.jar, tem a seguinte estrutura interna:

teste.jar
| - teste.class
| - teste/teste.txt
| - META-INF/MANIFEST.INF

o arquivo teste.class possui o seguinte código:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;


public class teste {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File f = new File("teste/teste.txt");
		try {
			FileReader freader = new FileReader(f);
			char [] c = new char[(int) f.length()];
			freader.read(c);
			System.out.print(String.valueOf(c));
		}catch(IOException e){
			e.printStackTrace();
		}
		
	}

}

Quando executo pelo eclipse TUDO OK, mas quando executo pelo JAR exibe o seguinte erro:

[color=red]C:>java -cp teste.jar teste

java.io.FileNotFoundException: teste\teste.txt (O sistema não pode encontrar o c

aminho especificado)

at java.io.FileInputStream.open(Native Method)

at java.io.FileInputStream.(Unknown Source)

at java.io.FileReader.(Unknown Source)

at teste.main(teste.java:16)[/color]

O que estou fazendo de errado? se funciona no eclipse pq não está funcionando na linha de comando de execução do jar??

Vlw

4 Respostas

ken420

Cara sou iniciante tambem mas posso tentar ajudar vc, o erro é esse
java.io.FileNotFoundException: teste\teste.txt (O sistema não pode encontrar o c
aminho especificado)

Deve ser alguma coisa no caminho do teu arquivo tente colocar o caminho inteiro onde situa-se o arquivo ;] abraco!

AGAraujo

O lance é que estou utilizando arquivo jar e preciso fazer com que seja reconhecido o caminho relativo.

Mas valeu pela ajuda.

Abração pela dica!

rael_gc

O problema é que você está tentando ler um arquivo que está dentro do JAR como se fosse um arquivo comum… aí não há milagre que faça funcionar mesmo.

Troque a linha:

FileReader freader = new FileReader(f);

por

InputStreamReader in = new InputStreamReader(this.getClass().getResourceAsStream(f));

Repare que eu chamei freader de in.

AGAraujo

Galera obrigadão!!

Problema resolvido.

Minhas conclusões:

  • o jar nada mais é do que o meu EXE equivalente, possuindo recursos internos… (por exemplo no EXE: Strings, Icones, Bitmap, etc)
  • todos os recursos dinâmicos e necessários para a aplicação DEVEM ficar fora do JAR, assim como acontece no EXE (arquivos .ini, .config, .dat, etc);
  • MAS, diferente do EXE, que não pode alterar seus recursos por si próprio, o JAR pode, pois seus recursos podem ser vistos diferente de um EXE e a maneira de fazer isto esta no arquivo em anexo cujo fonte do arquivo Lixo.class é:
...
public String getDados(){
    try {
     InputStream in = this.getClass().getResourceAsStream("teste.txt");
     InputStreamReader freader = new InputStreamReader(in);
     char [] c = new char[100]; // Utilizar a maneira convencional para definir o tamanho
     freader.read(c);
     freader.close();
     return String.valueOf(c);
   }catch(IOException e){
     return e.getMessage();
   }
}
...

Obrigadão a todos. Vlw

Criado 4 de abril de 2009
Ultima resposta 5 de abr. de 2009
Respostas 4
Participantes 3