Leitura de imagem em um JAR

5 respostas
M

OLá pessoal!

Estou tendo um problema aqui com a leitura de uma imagem em um aquivo Jar. O que me deixa mais confuso é que quando rodo o programa via eclipse funciona normalmente, mas depois que exporto para o jar quando tento rodar o programa eu recebo a seguinte exception:

java.lang.IllegalArgumentException: input == null!

O código que estou utilizando para carregar minhas imagens que estão dentro de uma pasta é este:

.
.
image = ImageIO.read(getClass().getClassLoader().getResource(pName));
.
.
Se alguem tiver uma solução o dica eu agradeço ok.

Abraços a todos.

5 Respostas

ViniGodoy
  1. Verifique se as letras maiúsculas e minúsculas coincidem. Num .jar isso faz diferença;
  2. Verifique se o caminho da imagem está certo. Ele deve começar com /;
  3. Verifique se o conteúdo da variável pName está mesmo correto.
M

Olá ViniGodoy!

Se eu coloco nomes que iniciam com / ele nao encontra o arquivo mesmo no eclipse, como por exemplo:

/images/teste.gif ou //images//teste.gif

No eclipse ele funciona com

./images/teste.gif ou \images\teste.gif ou \images\teste.gif

Mas nenhum destes funcionou no jar

Abraços

ViniGodoy

Estranho, só dando um copy&paste do meu projeto:

private URL imageURL(String name)
    {
        return getClass().getResource(
                "/com/siemens/com/husim/item/gui/images/" + name);
    }

    /**
     * Loads the given image as a buffered image.
     * 
     * @param name The name of the image. (e.g. itemLogo.png)
     * @return The image loaded as a buffered image or null if the image could
     *         not be loaded.
     */
    public BufferedImage getImage(String name)
    {
        BufferedImage img = images.get(name);
        if (img != null)
            return img;
        
        try
        {            
            img = ImageIO.read(imageURL(name));
            images.put(name, img);
            return img;
        }
        catch (IOException e)
        {
            System.err.println("The image " + name + " could not be loaded.");
            return null;
        }
    }

No eclipse (que também é o que eu uso), onde você está guardando as suas imagens? Geralmente elas tem que ficar junto aos sources, caso contrário elas não serão encontradas. Isso porque o getResource() vai procurar dentro do seu classpath.

Nem que vc crie um pacote chamado image na raiz dos sources.

No meu caso, a propriedade images refere-se a um mapa. Nada mais é do que um cache de imagens. Como essa classe é usada para guardar ícones, isso evita carregar os ícones multiplas vezes, além de poupar um pouco de memória.

M

Olá ViniGodoy!

Você nem sabe o que era. Uma imagem maldita estava com o nome imagem.GIF em maiúsculo. Porém o windows explorer exibia imagem.gif, então eu colocava imagem.gif no programa. Percebi o erro quando dei um dir no bom e velho DOS.

Affff…

Obrigado pelas dicas.

Abraços

ViniGodoy

É, tem que tomar cuidado porque o Windows não é case sensitive, mas o .jar é. O que é bom, já que isso te força a deixar o problema compatível com Unix também, mesmo que depois vc decida tirar o arquivo do .jar.

Criado 9 de junho de 2008
Ultima resposta 11 de jun. de 2008
Respostas 5
Participantes 2