Вверх на один уровень в JAR-ресурсе - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующая иерархия пакетов:

base--images--img.png
    |
    --code--Foo.java
    |
    --Base.java

То есть у меня есть пакет base, который имеет 2 подпакета, base.images и base.code с соответствующими файлами в каждом. Base.java просто вызывает метод в Foo.

Все это входит в base.jar при сборке.

Проблема: как Foo.java загрузить img.png независимо от того, где находится банка или откуда он бежит?

Некоторые вещи, которые я пробовал:

new File("../images/img.png")
Foo.class.getResource("../images/img.png")

Ни одна из этих операций не работает, потому что "../images/img.png" добавляется к пути, из которого запускается JAR, а не к пути класса.


MWE:

In Foo.java:

package base.code;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;

public class Foo {

    public static void main(String[] args) {
        URL url = Foo.class.getResource("/graphs/1.png");

        try {
            BufferedImage img = ImageIO.read(url);
        } catch (IOException e) {
            System.err.println("Image not found!");
        }
    }

} 

В Base.java:

package base;

public class Base {
    public static void main(String[] args)
        Foo.main(args);
    }
}

1 Ответ

0 голосов
/ 09 мая 2018

Ресурсы находятся на пути к классам, никогда не используйте файл. Они могут храниться в банке (в формате zip).

Решение состоит в том, чтобы просто использовать абсолютный путь. Это более понятно, чем относительный путь пакета класса.

Foo.class.getResource("/base/images/img.png")
...