Ścieżka względna zmienia się zależnie od tego czy odpalam lokalnie czy w w *.jarze.

0

Mam problem, bo mam dwa sposoby wskazywania ścieżki obrazów oraz dźwięków w aplikacji, ale tylko jeden z nich działa odpalając program przez IDE, a jeden uruchamiając zbudowaną apkę w *.jarze.

Ten działa w IDE, ale nie działa w *.jarze:

ImageIO.read(new File(filename));
clip.open(AudioSystem.getAudioInputStream(new File(filename)));

Ten działa w *.jarze, ale nie działa w IDE:

ImageIO.read(getClass().getClassLoader().getResource(filename));
InputStream is = getClass().getClassLoader().getResourceAsStream(filename);
clip.open(AudioSystem.getAudioInputStream(new BufferedInputStream(is)));

Struktura plików wygląda tak
d942fe663d.png
I nawet jeżeli przemieszczę folder resources do src, do main, do java, albo do content root i podaję za filename=resources/plik.wav czy plik.wav to niestety pierwsza wersja nigdy nie działa w *.jar. Natomiast żadna z powyższych konfiguracji nigdy nie działa przy zastosowaniu drugiego przypadku w IDE.

Nie chcę mieć dwóch sposobów podawania ścieżki do debuga i do kodu do builda. Co robić?

Chciałbym zrobić tak żeby jeden z nich działał i w IDE i w *.jarze.

1

Jeśli zasoby są pakowane do JARa to sposób z File nie zadziała. Zastosuj getResourceAsStream oraz ścieżki bezwzględne, czyli zaczynające się od /.

1

Rozwiązanie z getResource działa w IDE, w pliku jar i w konsoli. W złym miejscu umieszczasz zasoby, one powinny być w katalogu z klasami (w InelliJ jest to katalog out).
Nie używam getClassLoader i zasoby odczytuje tak:

className.class.getResource(fileName);

fileName to ścieżka względna w stosunku do klasy className.
Mały OT, niepoprawnie używasz imiesłowów. W obu częściach zdania ale tylko jeden z nich działa odpalając program przez IDE powinien byś ten sam sam podmiot. W cytowanym fragmencie, w pierwszej części podmiotem jest sposób (który działa), a w drugiej Ty (odpalasz IDE). Jedna z poprawnych możliwości: ale tylko jeden z nich działa gdy odpalam program przez IDE.

0

Ale obrazki chce mieć w repozytorium, a średnio mi się podoba pomysł żeby comittować out. Jakieś pomysły?

1 użytkowników online, w tym zalogowanych: 0, gości: 1