2010-04-14 30 views
9

Mam plik jar z zasobami (głównie konfiguracja dla buforów, rejestrowania itp.), Które chcę rozpowszechniać.Uzyskiwanie dostępu do zasobów JAR

Mam problem z względnymi ścieżkami do tych zasobów, więc zrobiłem to, co znalazłem w innym pytanie stackoverflow, który powiedział, że był to ważny sposób:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

Niestety to robi nie działa.

Wszelkie pomysły? Dzięki!

PS: Oczywiście nie mogę używać bezwzględnych ścieżek, i chciałbym, aby uniknąć zmiennych środowiskowych, jeśli to możliwe

+0

Czy plik zasobów znajduje się w tym samym folderze, co plik klasy? Czy jest to samodzielna aplikacja, czy działa na serwerze internetowym? – kgiannakakis

+0

To rzeczywiście jest w tym samym folderze. Jest to słoik przeznaczony do włączenia do aplikacji sieciowej, tak (ale myślę, że to powinno być nieistotne) –

+2

istotne jest, aby reguły wyszukiwania zasobów związanych z daną klasą były implementowane przez definiujący moduł ładujący klasy. Tak więc program ładujący klasy Twojej aplikacji internetowej może działać nieco inaczej w zależności od implementacji. Tylko myśl. –

Odpowiedz

11

Upewnij się, że folder zasobów jest wymieniony jako folder źródłowy w ustawieniach projektu. Upewnij się także, że folder zasobów jest ustawiony na eksport podczas budowania słoika.

Możesz dodać rozszerzenie .zip do pliku jar, a następnie otworzyć je, aby upewnić się, że twoje zasoby są zawarte w oczekiwanej lokalizacji.

Zawsze używam ścieżek absolutnych tak:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

Podczas korzystania ścieżek absolutnych „/” jest folder główny w pliku jar, nie folder główny urządzenia hosta.

+4

+1 dla zwróć uwagę na/bycie głównym folderem słoika. – Powerlord

+0

Rzeczywiście użyłem metody (bezwzględnej) ścieżki bezwzględnej, którą opisałeś i zadziałało! Nie wiem, dlaczego to nie poradziło sobie z relatywnym ... ale wystarczająco dobre jest wystarczająco dobre –

1

zawsze muszę puzzle przez getResourceAsStream do tej pracy. Jeśli "resource.xml" jest w org/pablo/opus, myślę chcesz to:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 
1

gdzie okazało się, że resource.xml? Jeśli w katalogu głównym drzewa źródłowego spróbuj przedrostkiem go /.

+0

Nie znajduje się w katalogu głównym drzewa źródłowego. Jest w pakiecie –

+1

, więc traktuj w pełni kwalifikowaną nazwę jako bezwzględną ścieżkę, na przykład com.me.i.u.effects.css będzie dostępny jako /com/me/and/u/effects.css – Seffi

1

zwykle przechowywać pliki i inne zasoby, a następnie pobrać je jako URL:

URL url = MyClass.class.getResource("/design/someResource.png"); 

w statycznej kontekstu, albo inaczej:

URL url = getClass().getResource("/design/someResource.png"); 

Od instancji.

Powyższe urywki zakładają, że projekt jest folderem najwyższego poziomu w słoiku. Ogólnie, jeśli ścieżka zaczyna się od "/", przyjmuje ścieżkę bezwzględną, w przeciwnym razie jest względna z lokalizacji klasy.

Powiązane problemy