Przede wszystkim przeczytałem wielu S.O. pytania dotyczące tego tematu i wypróbowałem to, co w nich zasugerowałem.W jaki sposób należy uzyskać dostęp do zasobów w skompilowanym słoiku?
Oto moja sytuacja. Piszę aplikację Java, korzystając z frameworku Processing i jestem na końcowym etapie, gdzie muszę zacząć myśleć o pakowaniu aplikacji. Plik JAR wykonywany z wiersza poleceń jest tym, co próbuję utworzyć przy użyciu funkcji eksportu w Eclipse.
Struktura mojego projektu wygląda następująco:
src/
multiple packages/
libs/
jar files and natives
data/
fonts and images
config/
json files
Kiedy wyeksportować plik jar i uzip słoika do wglądu jego zawartość, uważam, że zawartość tych katalogów zostały wrzucone do najwyższego poziomu .jar.
który wygląda tak:
.jar
packages
jar files
fonts
json files
Tak więc, gdy próbuję załadować plik konfiguracyjny z czymś takim:
BufferedReader reader = new BufferedReader(new FileReader(path));
wszystko działa tylko plik po uruchomieniu aplikacji w Eclipse. Ale plik jar zgłasza FileNotFoundException
.
Wiele pytań, które widziałem na S.O. w związku z takimi problemami zalecamy użycie opcji class.getClass().getResource()
lub class.getResourceAsStream()
. Próbowałem zarówno tych wykorzystujących względnych ścieżek i tylko w nazwie pliku jak w:
class.getResource('config.json');
class.getResources('cfg/config.json');
class.getResourceAsStream('../../config.json');
Wszystkie z tych metod zwraca null, gdy uruchamiane z obu Eclipse lub słoika przy użyciu:
java -jar myjarfile.jar
jestem również otwarte na użycie pliku Ant. W rzeczywistości używam pliku Ant wygenerowanego przez funkcję eksportu, aby zbudować słoik. Jeśli jest coś, co mogę dodać do tego, żeby dodać katalogi do słoika, który też byłby świetny.
Dziękuję za odpowiedź. Czy sugerujesz, że używam przedniego ukośnika w dodatku do getResource()? – JeremyFromEarth
Wydaje się, że jest znacznie bliżej. To jest ścieżka, która to zwraca: jar: file:/C:/path_to_project/myjarfile.jar! /config.json Jednak, gdy uruchomię słoik, nadal otrzymuję plik nie będący wyjątkiem, nawet jeśli ścieżka jest prawidłowa. Powinienem również wspomnieć, że działa z poziomu Eclipse. – JeremyFromEarth
Nie można używać FileReaders z zasobami wewnątrz słoików. Musisz użyć metody InputStream zwróconej przez getResourceAsStream. –