Problemas com Image

Olá! Minha aplicação fica alocada no SystemTray. Quando eu uso o caminho absoluto da imagem no meu código (pegando desde a raiz e tal), a imagem é exibida. No caminho relativo, não. Porém a imagem está no meu projeto.

Screenshot_20181008_102142

Quando eu mudo pro caminho relativo, fica:

Screenshot_20181008_102633

E o código que eu estou usando é:

Image image = Toolkit.getDefaultToolkit().getImage("/home/caminhoabsoluto/imgs/imagem.jpg");

O que posso fazer pare resolver isso? Afinal, quando eu for gerar um JAR, com certeza isso dará problema…

Tentei com
Image image = new ImageIcon(this.getClass().getResource("/imgs/imagem.jpg")).getImage();

Mas parece que o “this” se refere ao JFrame e não é o que preciso…

InputStream arquivo = getClass().getResourceAsStream("/imgs/imagem.jpg");
Image image = ImageIO.read(arquivo);

Oi @staroski!

Ele me retorna isso.

java.lang.IllegalArgumentException: input == null! javax.imageio.ImageIO.read(ImageIO.java:1348)

Tentei ver por que está vindo nulo e pensei ser o caminho, mas como você indiciou na resposta não creio ser isso…

EDIT: Tratando um pouco mais as exceptions, entendi que ele não tá procurando o arquivo… Ele só está retornando null. E eu não consigo entender o pq…

EDIT2: O arquivo, quando debugado, retorna “null”. E nem com caminho absoluto ele consegue achar!

Por acaso a pasta imgs está no classpath de sua aplicação?
Se estiver, então o caminho relativo é somente "/imagem.jpg".

O getClass().getResourceAsStream não funciona com caminhos absolutos, só funciona com caminhos relativos.
Por isso o caminho tem que começar com "/", pra ele procurar a partir da raíz do classpath de sua aplicação.

Entendi, staroski. Eu não sei bem o que é esse classpath, seria tipo “a pasta do Projeto”? (Eu não lembro nunca de ter configurado isso, então acredito que esteja Default. Uso Linux, se muda algo).

Não, classpath é uma propriedade de sistema do Java, pode conter diretórios e/ou arquivos .jar e .zip.
São os caminhos onde a máquina virtual vai tentar localizar classes e recursos (imagens ou outros arquivos) de sua aplicação.

Você pode setar ele em linha de comando com a propriedade, exemplo:

java -cp ".\pasta1;C:\pasta2\subpasta;.\pasta3/subpasta2\outraSubpasta;C:\caminho\arquivo.jar" nome.do.pacote.NomeDaClasseMain

Se você está usando alguma IDE então isso costuma ficar nas propriedades do projeto, provavelmente numa opção classpath ou libraries.

Estou usando IntelliJ. Pelo que entendi, tenho que colocar a imagem em algum lugar do classpath. Vou procurar aqui nas propriedades e ver…

@staroski, o fato de eu estar usando o Gradle muda algo?