Próbuję znaleźć ścieżkę do zasobu, ale nie miałem szczęścia.
To działa (zarówno w IDE, jak i z JAR), ale w ten sposób nie mogę uzyskać ścieżki do pliku, tylko zawartość pliku:
ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));
Jeśli to zrobię:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());
Wynik to:
java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
Czy istnieje sposób na uzyskanie ścieżki do pliku zasobów?
Odpowiedzi:
To jest celowe. Zawartość „pliku” może nie być dostępna jako plik. Pamiętaj, że masz do czynienia z klasami i zasobami, które mogą być częścią pliku JAR lub innego rodzaju zasobu. Program ładujący klasy nie musi udostępniać uchwytu pliku do zasobu, na przykład plik jar mógł nie zostać rozszerzony na pojedyncze pliki w systemie plików.
Wszystko, co możesz zrobić, pobierając plik java.io.File, można zrobić, kopiując strumień do pliku tymczasowego i robiąc to samo, jeśli plik java.io.File jest absolutnie konieczny.
źródło
Podczas ładowania zasobu zwróć uwagę na różnicę między:
i
Myślę, że to zamieszanie powoduje większość problemów podczas ładowania zasobu.
Ponadto podczas ładowania obrazu jest łatwiejszy w użyciu
getResourceAsStream()
:Jeśli naprawdę musisz załadować plik (inny niż obraz) z archiwum JAR, możesz spróbować tego:
źródło
bin
Przed użyciem ścieżki `/com/myorg/filename.ext ' umieść pliki, które chcesz odczytać w folderze i przejdź do katalogu klasy ładującej się do zasobów.Jedna linia odpowiedzi brzmi:
Zasadniczo
getResource
metoda podaje adres URL. Z tego adresu URL możesz wyodrębnić ścieżkę, dzwoniąctoExternalForm()
Bibliografia:
getResource () , toExternalForm ()
źródło
file:/
do ścieżki, która działa w jar, ale nie w IDESpędziłem trochę czasu, bawiąc się tym problemem, ponieważ żadne rozwiązanie, które znalazłem, w rzeczywistości nie działało, o dziwo! Katalog roboczy często nie jest katalogiem JAR, zwłaszcza jeśli plik JAR (lub jakikolwiek inny program) jest uruchamiany z menu Start w systemie Windows. Oto, co zrobiłem, i działa to w przypadku plików .class uruchamianych spoza JAR, tak samo jak działa w przypadku JAR. (Testowałem to tylko pod Windows 7.)
źródło
jeśli
netclient.p
znajduje się w pliku JAR, nie będzie miał ścieżki, ponieważ ten plik znajduje się w innym pliku. w takim przypadku najlepsza ścieżka, jaką możesz mieć, to naprawdęfile:/path/to/jarfile/bot.jar!/config/netclient.p
.źródło
Musisz zrozumieć ścieżkę w pliku jar.
Po prostu określ go względnym. Więc jeśli masz plik (myfile.txt), znajdujący się w foo.jar w
\src\main\resources
katalogu (styl maven). Można to odnieść tak:Jeśli zrzucisz swój jar za pomocą
jar -tvf myjar.jar
, zobaczysz wyjście i względną ścieżkę w pliku jar i użyjesz FORWARD SLASHES.źródło
File.separator
.W moim przypadku zamiast Path użyłem obiektu URL.
Plik
Zasób w classpath przy użyciu classloader
Gdy potrzebuję przeczytać treść, mogę skorzystać z następującego kodu:
Możesz uzyskać dostęp do treści za pomocą InputStream.
źródło
To ten sam kod od użytkownika Tombart z opróżnieniem strumienia i zamknięciem, aby uniknąć niekompletnego kopiowania zawartości pliku tymczasowego z zasobu jar i mieć unikalne nazwy plików tymczasowych.
źródło
Plik jest abstrakcją dla pliku w systemie plików, a systemy plików nie wiedzą nic o zawartości pliku JAR.
Spróbuj z URI, myślę, że istnieje protokół jar: //, który może być przydatny do twoich celów.
źródło
Następująca ścieżka zadziałała dla mnie:
classpath:/path/to/resource/in/jar
źródło
Zdobycie tego
getSystemResourceAsStream
jest najlepszą opcją. Pobierając strumień wejściowy zamiast pliku lub adresu URL, działa w pliku JAR i jako samodzielny.źródło
Może być trochę późno, ale możesz użyć mojej biblioteki KResourceLoader, aby pobrać zasób ze swojego jar:
źródło
W pliku jar zasób znajduje się absolutnie w hierarchii pakietów (nie w hierarchii systemu plików). Jeśli więc masz klasę com.example.Sweet ładującą zasób o nazwie „./default.conf”, wówczas nazwa zasobu jest określana jako „/com/example/default.conf”.
Ale jeśli jest w słoiku, to nie jest to plik ...
źródło
Wewnątrz folderu zasobów (java / main / resources) twojego jar dodaj swój plik (zakładamy, że dodałeś plik xml o nazwie imports.xml ), a następnie wstrzyknij,
ResourceLoader
jeśli używasz sprężyny jak poniżejFunkcja inside tour napisz poniższy kod, aby załadować plik:
źródło
Może tę metodę można zastosować do szybkiego rozwiązania.
źródło
java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.CodeSource java.security.ProtectionDomain.getCodeSource()' on a null object reference
podążaj za kodem!
/ src / main / resources / file
źródło