2012-07-15 19 views
7

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.

Odpowiedz

5

Aby dotrzeć do zasobów w katalogu głównym, dodaj do ścieżki /. Jeśli nie, robisz to w stosunku do bieżącego pakietu, co jest zwykle przydatne tylko wtedy, gdy zasób fizycznie znajduje się obok klasy w twoich źródłach.

Użyj więc class.getResourceAsStream("/config.json");, aby uzyskać plik config.json w katalogu głównym słoika.

Należy również zauważyć, że słoiki wewnątrz słoików nie są obsługiwane bezpośrednio.

+0

Dziękuję za odpowiedź. Czy sugerujesz, że używam przedniego ukośnika w dodatku do getResource()? – JeremyFromEarth

+0

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

+1

Nie można używać FileReaders z zasobami wewnątrz słoików. Musisz użyć metody InputStream zwróconej przez getResourceAsStream. –

1

Twój plik .jar powinien po prostu zawierać katalogi związane z "pakietem" skompilowanego kodu. Możesz odwoływać się do struktury .war z/lib/WEB-INF itp., A to jest inne.

Jeśli struktura pakietu jest:

com.yourco.authentication 

I klasa się Login

Wtedy twój słoik powinien być

/com/ 
    /yourco/ 
    /authentication/ 
     Login.class 

następnie trzeba się .jar w ścieżce klas dla ENV uruchomić za pomocą wiersza poleceń.

Widzę, że działa w Eclipse, który prawdopodobnie ma ustawienia środowiska i zaimportował wymagane biblioteki itp., Więc trudno to dokładnie określić. Jeśli twoje paczki/folder zawiera skompilowany kod java, nie jestem pewien, czy to zadziała, gdy zostanie odwołany na zewnątrz, sugerując w ten sposób rozpoczęcie twoich pakietów w folderze głównym.

+0

Widzę inne sugestie dotyczące edycji kodu w celu odniesienia /. bez testowania może to działać, ale wygląda na to, że próbujesz spakować aplikację, a nie bibliotekę ze strukturą katalogów. –

Powiązane problemy