Problem z Runnable JAR File

0

Stworzyłem pewien projekt w javafx i są w nim zdjęcia. W Eclipse wybieram standardowo Export i Runnable JAR File i następnie kończę proces exportu po czym otwieram poprzez podwójne kliknięcie utworzony plik i on oczywiście działa tak jak powinien - wszystko jest w jednym pliku JAR. Ale problem pojawia się kiedy... przenoszę ten plik w inne miejsce np. na pendrive-a lub do innej lokalizacji na dysku - wówczas okazuje się, że... program działa, ale zdjęcia się w nim nie pokazują. Nie spotkałem się nigdy z podobnym problemem i nie wiem co może być tego powodem - miał ktoś może podobny problem? Bardzo proszę o pomoc...

1

Strzelam w ciemno - nie pakujesz wszystkich dependencies.
Czym budujesz aplikację? Jakiś Maven/Gradle?
Fat jarpowinien chyba załatwić sprawę.

0

Nie, zwykły JavaFx Project i inne projekty które robiłem tak samo kilka miesięcy temu mi działają cały czas (w sensie pliki Jar z tych plików)...

0

Tak tylko dla pewności spytam w jaki sposób ładujesz te zdjęcia ?
Zajrzyj do środka jar'a czy znajdują się tam te zdjęcia.

0

Tak, są, sprawdzałem to i w tych co mi działały też były dlatego właśnie mnie to tak dziwi....

1

Klasyka :P "JAK" ładujesz te zdjecia? Przez get class resources? Zgaduje że nie. Że masz tam jakieś ścieżki "na pałe" a to tak nie zadziała. Czytanie plików z wnętrza jara wymaga odpowiedniego mechanizmu. Potrzebujesz czegoś w stylu

getClass().getResourceAsStream("/zdjecie.jpg"); 
0

new Image(getClass().getResource("logo.png").toExternalForm())

Ale wcześniej też tak ładowałem i działało normalnie...

0

A nie podajesz - mimo wszystko - ścieżek bezwzględnych od tych zdjęć tzn. ścieżki do JARa i dopiero od JAR-a dalszą ścieżkę do resource'ów (zdjęć) wewnątrz?

Sprawdź, czy gdzieś pod spodem nie ma czegoś takiego:

...
Caused by: java.io.FileNotFoundException: /app_path/application.jar!/BOOT-INF/classes!/images/image.png
0

Nic się nie pojawia w konsoli jako błędy czy ostrzeżenia... Projekt normalnie startuje w Eclipse i jako Runnable Jar też tylko jak go przenoszę w inne miejsce to nie działają zdjęcia... I taki sposó działał w innych aplikacjach... Nie podawałem bezwzględnych ścieżek tylko właśnie względne żeby uniknąć tego że jak plik się usunie (otworzę Jara na innym komputerze gdzie nie będzie tych plików w bezwzględnych ścieżkach) to wtedy by na pwno nie zadziałało....

1

Jak odpalasz program w konsoli?
Czy używasz?:

java -jar NazwaTwojegoPlikuJar.jar

Jak wygląda struktura katalogów pakowanej aplikacji?

program działa, ale zdjęcia się w nim nie pokazują.

To co się pokazuje? Screen mile widziany

0

Odpalam przez Ecpilsa, ale w konsoli w Eclipse nie pojawiają się żadne błędy...!

2

tylko jak go przenoszę w inne miejsce to nie działają zdjęcia

Czarów nie ma. Albo masz w kodzie klasyczne idotyczne

catch(Exception e){
//a na co mi to?
}

albo jednak w konsoli są wyjątki. Odpalasz ten program z konsoli przez java -jar czy po prostu dwuklik? Bo po dwukliku nie ma konsoli a więc też logów na stdout

Odpalam przez Ecpilsa, ale w konsoli w Eclipse nie pojawiają się żadne błędy...!

No cieszymy sie, ale eclipse odpala z innymi scieżkami. Przenieś jara w inne miejsce i odpal go z konsoli łaskawie. Albo wrzuć to tego jara i zrobimy to za ciebie. Albo podlinkuj githuba. Niestety w innym wypadku muszę iść na strych po szklaną kulę.

0

Nie mam pustych catchów, to jest bardzo prosty program... Odpalam przez dwuklik...

0

Aby otrzymać pomoc musisz odpowiadać na pytania.
Spróbuj przenieść swoją aplikację i uruchomić za pomocą konsoli/terminala używając wyżej wymienionej komendy, a nie przez Eclipse
Masz windowsa więc przejdź do folderu zawierającego twój plik jar, otwórz menu i wybierz odpowiednią opcję uruchomienia konsoli.
Jeżeli możesz tylko PowerShell to włącz go, wpisz cmd i klepnij enter, a następnie komendę, o której wspomniałem wyżej.
Wrzuć tutaj wszystko co się pojawi (za pewne stack trace błędów).

0

Pojawia się coś takiego, a więc bez błędów i bez zdjęcia...

1

Dej tego jara bo do niczego nie dojdziemy
Ale jak znajdę pustego catcha to obiecuje że cię znajdę... :D

1

Skoro nie używasz żadnego mavena/gradle tylko tak po prostu sklecasz runnable JARa w Eclipse, to jaką masz gwarancję, że Twoje obrazki w ogóle lądują w JARce? :P

  • Otwórz ten Twój JAR wypluty przez Eclipse w jakimś WinRAR (tak, to jest zwykłe skompresowane archiwum, tylko nafaszerowane odpowiednimi plikami aby JRE mogło to archiwum wykonać) i spróbuj odnaleźć te pliki. Pewnie ich tam nie ma, jak już sugerował @Burdzi0 - nie sprawdziłeś tego, tylko kręcisz się w kółko i zarzekasz że się zrobiło i powinno działać i nie wiesz czemu nie działa, prawda? :P
  • W międzyczasie zrób, o co proszą, i odpal z konsoli, a nie dwu-klikiem. Niby gdzie mają się printować ewentualne błędy, skoro nie robisz ani bloków try-catch które mogłyby np. otworzyć Ci error prompt z jakąś informacją o błędzie, ani nie możesz zobaczyć outputu ze stdout / stderr? :P
  • spróbuj użyć jakichś cywilizowanych build tooli (gradle/maven) zamiast jakiegoś automagicznego exportera Eclipsa, którego pewnie nawet nie konfigurowałeś tylko odpaliłeś z defaulta ;) korzystając przy okazji z tutoriali/dokumentacji by ogarnąć, jak pakować nimi różne zasoby do JARa :P
0

Nie można załączyć Jara więc przesyłam link...
https://drive.google.com/file/d/1peC4FJpkwnyORaMfVJ0K5ftq_csfk-AE/view?usp=sharing

0

U mnie działa. Ale robisz tam:

Image image = new Image(this.getClass().getResource("logo.png").toExternalForm());

i nie jestem do końca pewien takiej względnej ścieżki, może tu gdzieś leży problem na innej wersji javy

0

No to ja już kompetnie nie wiem o co chodzi...
Kiedyś też robiłem takie jary i one mi teraz też działają a ten co zrobiłem teraz jak pokazywałem na screenach nie działa (zdjęcie w sensie) jak przeniosę na inny nośnik...

0
marcin070707 napisał(a):

No to ja już kompetnie nie wiem o co chodzi...

Nie mówi się nie wiem o co chodzi, tylko muszę sprawdzić dokładniej o co chodzi :p

Weź sprawdź na przykład, z jakich wersji JDK i JRE korzysta Eclipse w Twojej konfiguracji, jakie wersje Javy masz w ogóle zainstalowane (gdzieś pod C:\Program Files\Java lub czymś podobnym) - i sprawdź, jaka wersja JRE jest faktycznie używana do odpalenia JARa gdy otwierasz go spoza Eclipse.

I skoro masz tak silne opory przed odpalaniem swojego programu z konsoli, to weź chociaż dorzuć do programu (na potrzeby debugowania) AlertBoxa (czy jak to tam się w JavaFX nazywało, dawno nie używałem JavaFX) który wyrzuci Ci na ekran ścieżkę do pliku zwracaną przez ten Twój łańcuszek z getResource w roli głównej - i porównaj sobie co zwraca gdy odpalasz w Eclipse, z palca dwu-klikiem oraz rzeczywiste miejsce przesiadywania pliku. Łatwiej Ci będzie szukać błędu gdy będziesz widział, co Twój program próbuje robić pod spodem :p

0
marcin070707 napisał(a):

No to ja już kompetnie nie wiem o co chodzi...
Kiedyś też robiłem takie jary i one mi teraz też działają a ten co zrobiłem teraz jak pokazywałem na screenach nie działa (zdjęcie w sensie) jak przeniosę na inny nośnik...

Sprawdź, czy nie masz jakichś bloków try-catch, których mógłbyś się pozbyć, żeby aplikacja Ci się po prostu wywaliła z jakimś błędem - tj. nie obsługuj wyjątków, tylko jeśli coś się ma wywalić, niech tak się stanie.
Jeśli masz tam jakieś checked exceptions, których nie chcesz propagować - na chwilę opakuj je w jakiś RuntimeException i rzuć ten wyjątek z bloku catch.
Spakuj sobie takiego JARa i spróbuj zbadać zachowanie aplikacji.

Dodatkowo, jak pisał @superdurszlak, dodaj sobie jakieś komunikaty o tym, czy udało się znaleźć / otworzyć plik, jaka jest ścieżka (względna, bezwzględna) do tego pliku itd.
A może plik wczytuje się prawidłowo, tylko jest jakiś problem z renderowaniem?
Może wersja / konfiguracja Javy?

0

@superdurszlak @catom ale on wrzucił tego jara wyzej i on działa. Nie ma tam też żadnych catchy ;] Jedyne co przychodzi mi do głowy to inne handlowanie względnej ścieżki w jakiejś wersji javy.

0

Wrzuciłem i screen z tym jak to wygląda u mnie po przeniesieniu na inny dysk i nie wiem jak to jest że u kogoś działa... Wrzuciłem też link do tego jara...
Mam:

  • jdk-8u202-windows-x64
  • jre-8u202-windows-x64
  • Eclipse IDE for Enterprise Java Developers, Version: 2018-12 (4.10.0), Build id: 20181214-0600
0

@Shalom @marcin070707

Widziałem tego JARa i odpaliłem u siebie bez problemu na JDK 8 Oracle'a.
5c7973b51075a.png

Hmm... Nie wiem, może jednak tutaj z jakiegoś powodu aplikacja nie ma dostępu do System.err i nie wypisuje stack trace wyjątku, który jest przechwytywany w metodzie application.Main.start()?
screenshot-20190301190408.png

0

Przedziwna sytuacja - zrobiłem aplikację w jar, u mnie działa, ale jak przeniosę ją na inny dysk to nie działa, a ta sama aplikacja w tym samym pliku jar na innym komputerze (u osoby którą ją pobrała i odpaliła u siebie) też działa...

3
marcin070707 napisał(a):

Przedziwna sytuacja - zrobiłem aplikację w jar, u mnie działa, ale jak przeniosę ją na inny dysk to nie działa, a ta sama aplikacja w tym samym pliku jar na innym komputerze (u osoby którą ją pobrała i odpaliła u siebie) też działa...

A teraz przenieś aplikację do ścieżki, która nie zawiera wykrzyknika :D

Aplikacja rzeczywiście działała, troszkę ją podrzeźbiłem by pokazywała ścieżkę, ale... Spójrz, co się stało, gdy utworzyłem sobie folder FOLDER! i umieściłem w nim JARa:

screenshot-20190301201101.png

Tak mnie jakoś naszło, jak zobaczyłem na jednym z Twoich zrzutów ten folder LUBIĘ TO!, że może Javę przerosło opanowanie np. polskich znaków i zacząłem się bawić - a tu proszę, znaki specjalne są niby enkodowane kodowaniem procentowym, ale wykrzykników to to nie tyka... no i wykrzyknik nabruździł :)

To teraz spróbuj zastąpić ścieżkę bezwzględną ścieżką względną i zobacz, czy będzie śmigać :P

0

Wygląda na to że faktycznie chodzi o to o czym napisałeś z tym wykrzyknikiem, bo jak przenoszę na ten sam dysk z folderem "LUBIĘ TO!" ale zmieniam nazwę na "LUBIE TO" to działa i u mnie :)

Tylko mam pytanie o co dokładniej chodzi z "To teraz spróbuj wywalić ścieżkę bezwzględną ścieżką względną i zobacz, czy będzie śmigać"?

2
marcin070707 napisał(a):

Tylko mam pytanie o co dokładniej chodzi z "To teraz spróbuj wywalić ścieżkę bezwzględną ścieżką względną i zobacz, czy będzie śmigać"?

Problem nie jest, z tego co widzę, nowy :) Spójrz, zgłoszenie z 2002r, a tu zgłoszenie do OpenJDK z 2001

Chodzi o to, że ta ścieżka nie jest normalną ścieżką - spójrz na przedrostek jar:file: przed ścieżką do pliku, oraz wykrzyknik po nazwie pliku JAR - wykrzyknik z grubsza oznacza miejsce, w którym kończy się "zwykła" ścieżka do pliku, a rozpoczyna ścieżka wewnątrz JARa (jak już wspomnieliśmy, JAR to tak naprawdę skompresowane archiwum), zatem ścieżka, która sama zawiera wykrzykniki, będzie robić dziada w trąbę :D

Gdyby udało się wymusić użycie wyłącznie ścieżki wewnątrz pliku JAR (czyli z pominięciem ścieżki do archiwum) ominąłbyś problem wykrzykników w ścieżce.

Spójrz jeszcze tu: https://www.geeksforgeeks.org/java-net-jarurlconnection-class-java/

0

Rozumiem, ale nie ma w takim razie metody jak to ominąć że folder w którym jest plik kończy się znakiem "!"? Nie jest to może mega problem bo zwykle tak nie jest, ale jednak może się tak zdarzyć jak u mnie teraz...

1 użytkowników online, w tym zalogowanych: 0, gości: 1