Problema ao carregar imagem a partir do jar

Criei um código simples que carrega uma imagem, no SWT… Quando executo a aplicação pelo Eclipse a imagem carrega perfeitamente e tudo funciona, porém após gerar o JAR e tentar executar pelo Sistema Operacional ele está dizendo que não encontra a imagem, sendo que a pasta e a imagem estão dentro do jar, é ridículo!

Caused by: java.io.FileNotFoundException: imagens\tabuleiro.png (O sistema não pode encontrar o arquivo especificado)

dentro do jar tenho uma pasta chamada imagens, e dentro dessa pasta tenho um arquivo chamado tabuleiro.png

O que estou fazendo de errado? Pela lógica nada!

Obrigado

Minha dúvida é tão ridícula, o erro é tão estúpido que até pra vocês fica foda responder né? :confused:

Que droga, alguém por favor chuta ae!

Obrigado!

Cara, antes de fazer um post eu acho melhor vocêdá uma pesquisada pra vê se alguém já postou alguma coisa parecida com o seu problema, eu acho que na semana passada já respondi a dois posts como esse mesmo problema.
O que tá acontecendo é que não está encontrando o path da imagem, dá uma conferida no path e se tu tá carregando a imagem tipo:

new ImageIcon(getResource("path/image.ext"));

ou algo parecido faz assim

new ImageIcon("path/image.ext"));

se ele não conseguir carregar a imagem não vai dar erro, só não vai mostrar a imagem.

Se a imagem está dentro de um jar tem que usar o getResource

Em 20 min voce já que a resposta… calma aew…

Então.

Como voce carrega a imagem?

new File("imagens/tabuleiro.png");
//ou
getClass().getResourceAsStream("imagens/tabuleiro.png");

eu estava fazendo assim:

tabuleiroComposite.setBackgroundImage(new Image(Display.getDefault(),“imagens/tabuleiro.png”));

mas quando coloquei assim:

tabuleiroComposite.setBackgroundImage(new Image(Display.getDefault(),getClass().getResourceAsStream(“imagens/tabuleiro.png”)));

passou a dar este erro, e no proprio eclipse, nem gerando jar

Exception in thread “main” java.lang.IllegalArgumentException: Argument cannot be null

Obrigado por enquanto

Não é obrigatório, pode sim colocar somente o path sem o getResource(), mas o problema dele com certeza é path que está errado, quando comecei a programar em java e criava os arquivos .jar tive esse mesmo problema quando comecei a usar getResource() até que descobri que era o path.

Não é obrigatório, pode sim colocar somente o path sem o getResource(), mas o problema dele com certeza é path que está errado, quando comecei a programar em java e criava os arquivos .jar tive esse mesmo problema quando comecei a usar getResource() até que descobri que era o path.[/quote]

mas eu não comecei a programar ontem… Sou programador C há anos e tenho certeza que o path está certo! existe a pasta e a imagem dentro dela!

Se o path está errado, prq q de dentro do eclipse funciona? incrível neh!

ATENÇÃO:

  1. O path é relativo ao classpath da sua aplicação: O getResourceAsStream leva o ClassPath como raiz, não o path do disco;
  2. Que o caminho é idêntico, levando em consideração letras maiúsculas e minúsculas. O sistema de arquivos não é case sensitive, no caso do Windows, mas no caso do .jar é;

É problema de path sim. A questão é que o path do eclipse baseia-se no sistema de arquivos, e o do .jar no jar. Um é case sensitive, outro não. Um está com a raiz na raiz do seu classpath, outro pode estar em qualquer pasta de execução do eclipse configurada em seu projeto.

Como você mesmo comprovou, rodar no eclipse não é garantia de nada.

Depois das palavras do Vinicius (ViniGodoy), você se convenceu que é o path.

Ta certo! é o path… mas qual a solução afinal? ta tudo minusculo!

Minha mentalidade é de C, eu penso apenas logicamente, não consigo interpretar conceitos do java. Pra mim se funciona no eclipse teria de funcionar fora também, aprece obvio! Eu não nasci pro java mesmo, só que na faculdade o java é a linguagem escolhida pelos professores :confused:

Obrigado por enquanto!

Pelo que li tenho que colocar no classpath o caminho do meu jar, mas isso não tem fundamento pois se eu colocar em outra pasta ele nao ira funcionar!

por favor alguem ajuda ae!

valew

[quote=aloha]Minha mentalidade é de C, eu penso apenas logicamente, não consigo interpretar conceitos do java. Pra mim se funciona no eclipse teria de funcionar fora também, aprece obvio! Eu não nasci pro java mesmo, só que na faculdade o java é a linguagem escolhida pelos professores :confused:

Obrigado por enquanto![/quote]

Aloha… eu também fui programador C. O Java é tão lógico quanto o C.

É bem simples. Crie uma pasta para os recursos do seu projeto, dentro do seu classpath. Você simplesmente criar um novo pacote entre os seus fontes, mas colocar recursos (jpgs, wavs, etc) lá dentro, ao invés de código.

Vamos supor que seu pacote seja:
aloha.imagens

E que dentro dessa pasta você tenha colocado a imagem “tabuleiro.png”.

Para carregar essa imagem você faz:

BufferedImage tabuleiro = ImageIO.read(getClass().getResource("/aloha/imagens/tabuleiro.png")); 

Com esse método o Java irá seguir as regras de classpath para procurar a sua imagem. Ou seja, no eclipse, ele procurará nos seus arquivos ali onde ele compilou os .class. No caso do .jar, o próprio .jar faz parte do classpath, e ele procurará lá também.

Você não pode é esperar que o construtor default de image, que aceita um “file”, faça a busca dentro do .jar para você. Ali sim, é feito para trabalhar com unidades de disco, e seria ilógico se isso fizesse uma busca dentro de um arquivo .jar.

ViniGodoy,

Não posso usar o BufferedImage, tirando isso não entendi mais nada…

“Crie uma pasta para os recursos do seu projeto, dentro do seu classpath” (mas o classpath nao eh um arquivo q fica dentro do jar?)

Ahhhh q droga, ta chegando a hora de entregar o jogo que é em rede e não consigo fazer o “mais facil” que é gerar o jar…

Valew cara, mas se puder ser mais especifico, eu nao quero aprender isso soh kero fazer funcionar!

Abraço

Consegui, mas mesmo assim ficou muito estranho…

na pasta imagens eu tenho varias imagens, e todas eu estava carregando assim:

labelStatus.setImage(new Image(Display.getDefault(),“imagens/status2.png”));

porem estava dando erro na imagem do tabuleiro, entao fiz oq ViniGodoy falou, ateh a extencao q estava PNG maiusculo tava dando erro :confused:

tabuleiroComposite.setBackgroundImage(new Image(Display.getDefault(),getClass().getResourceAsStream("/imagens/tabuleiro.PNG")));

entao eu apenas alterei a linha do tabuleiro e funcionou o JAR, eu clico 2x e ele executa perfeitamente, mas pera ae, e as outras imagens? prq nao precisou fazer o mesmo codigo pras demais? essa parte: getClass().getResourceAsStream("/imagens/tabuleiro.PNG")

agora sim nao entendo mais!

Obrigado a todos!

Como não? O BufferedImage é um Image! Você pode usar sim, senão não teria sugerido!

Não, classpath não é um arquivo. Você está confundindo com o manifest, não?
ClassPath é o caminho onde suas classes estão.

É o mais fácil, desde que você tome alguns cuidados, como usar o getResource() ao invés de ler as imagens direto do disco. Se você ler do disco, faça um zip do seu .jar com a pasta de imagens, e deixe que o usuário descompacte os dois juntos.

Para eu ser mais específico, só se vc zipar seu projeto e colar aqui no GUJ. Aí posso dar uma olhada e ajeitar o que estiver errado.

ViniGodoy! Aproveitando que voce vai ler esse post me mande o JGF plz. Eu tava procurando a versão que tem o pacote de network mas eu perdi.