Miałem problemy ze stosowaniem getClass().getResource("filename.txt")
metody. Po przeczytaniu instrukcji Java Docs, jeśli zasób nie znajduje się w tym samym pakiecie co klasa, z której próbujesz uzyskać dostęp do zasobu, musisz podać mu ścieżkę względną zaczynającą się od '/'
. Zalecaną strategią jest umieszczenie plików zasobów w folderze „resources” w katalogu głównym. Na przykład, jeśli masz strukturę:
src/main/com/mycompany/myapp
następnie możesz dodać folder zasobów zgodnie z zaleceniami maven w:
src/main/resources
ponadto możesz dodać podfoldery w folderze zasobów
src/main/resources/textfiles
i powiedz, że twój plik nazywa się myfile.txt
tak
src/main/resources/textfiles/myfile.txt
Tutaj pojawia się problem z głupią ścieżką. Załóżmy, że masz klasę w swojej com.mycompany.myapp package
i chcesz uzyskać dostęp do myfile.txt
pliku z folderu zasobów. Niektórzy mówią, że musisz podać:
"/main/resources/textfiles/myfile.txt" path
lub
"/resources/textfiles/myfile.txt"
oba są błędne. Po uruchomieniu mvn clean compile
pliki i foldery są kopiowane w:
myapp/target/classes
teczka. Ale folderu zasobów nie ma, tylko foldery w folderze zasobów. Więc masz:
myapp/target/classes/textfiles/myfile.txt
myapp/target/classes/com/mycompany/myapp
więc prawidłowa ścieżka do getClass().getResource("")
metody to:
"/textfiles/myfile.txt"
tutaj jest:
getClass().getResource("/textfiles/myfile.txt")
To nie będzie już zwracać wartości null, ale zwróci Twoją klasę. Mam nadzieję, że to komuś pomoże. Dziwne jest dla mnie, że "resources"
folder również nie jest kopiowany, a jedynie podfoldery i pliki bezpośrednio w "resources"
folderze. Wydawałoby mi się logiczne, że "resources"
folder byłby również znaleziony pod"myapp/target/classes"