pełna ścieżka do pliku z programem - niezależnie od miejsca wywołania

0

Mam pewien niebanalny problem. Otóż przy starcie mojej aplikacji pobieram ścieżkę, gdzie znajduje się program i zapisuję go do Stringa, z którego potem korzystam do zapisywania/odczytywania plików w aplikacji.

Jeśli użytkownik uruchamia aplikację z katalogu gdzie jest ten program to nie ma problemu, ale gdy znajduje się w innej lokalizacji i uruchomi program podając pełną ścieżkę do niego to dostaję nie ten wynik co trzeba.

Np.:

User jest w katalogu C:\

wpisze: C:\katalog_z_programem\uruchom.bat

To aplikacja się uruchomi, ale ścieżka do katalogu z aplikacją będzie mieć postać:
C:
zamiast:
C:\katalog_z_programem\

W Linuksie jest ten sam problem. Wiecie może jak to rozwiązać?


Od razu powiem, że próbowałem standardowych rozwiązań, typu:

 URL pUrl1 = NazwaKlasy.class.getClassLoader().getResource("NazwaKlasy.class"); 

 URL pUrl12 = NazwaKlasy.class.getResource(".");

 File katalog = new File(Jaspresso.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 

 File katalog=new File("");
String s =katalog.getAbsolutePath();

I nic nie działało jak należy, każdy ze sposobów wykładał się, gdy użytkownik uruchamia aplikację z innej lokalizacji podając właściwą ścieżkę do programu w konsoli.

0

A co zawiera plik uruchom.bat? Zapewne wystarczy jak w tym pliku będzie polecenie cd wymagany_katalog.

0

Od razu zaznaczyłem, że to nie chodzi o tak banalne rzeczy, z 3 programistami się nad tym zastanawiamy :D

bat jest w tym samym katalogu co jar i ma treść:

java -jar MOJ_JAR.jar

z resztą użytkownik pod linuksem np. może to wywołać tak, że jest w \usr\local\ a wywoła aplikację która jest w \home.

Podkreślam jeszcze raz, że to nie działa TYLKO, gdy user jest w innej lokalizacji niż program i poda ścieżkę do aplikacji w konsoli.

0

Moze to sie przyda (bash). Nie wiem jak pod windowsem, w zyciu nie napisalem ani jednego pliku bat...

ME="$0"
DIRNAME=$(dirname $ME)
pushd "$DIRNAME" &> /dev/null
DIRNAME=$(pwd)
popd &> /dev/null
BASENAME=$(basename $ME)
ABSOLUTE_ME=$DIRNAME/$BASENAME
echo $ABSOLUTE_ME

jak to umiescisz w pliku sh i uruchomisz ten plik z obojetnie jakiego miejsca, powinien wypluc pelna sciezke do siebie. Dalej juz powinienes sobie poradzic?

0

Coś kręcisz, przy takim pliku BAT program MOJ_JAR.jar z katalogu katalog_z_programem się w ogóle nie uruchomi. Jeżeli zmienna CLASSPATH zawiera katalog z plikiem MOJ_JAR.jar, to uruchomi się ten program MOJ_JAR.jar z tego katalogu, jeśli nie zawiera, to pojawi się komunikat Unable to access jarfile ....

0

Wygooglowałem kiedyś, powinno działać:

java.security.CodeSource source = this.getClass().getProtectionDomain().getCodeSource();
java.net.URI uri = new java.net.URI(source.getLocation().toString());
java.io.File f = new java.io.File(uri);

UWAGA: Działa tylko jak uruchomi się z jara (można niebezpośrednio, ważne żeby był jar).

0

Napiszę jeszcze raz. Jeżeli użytkownik wpisze C:\katalog_z_programem\uruchom.bat, katalogiem bieżącym nie jest katalog_z_programem, a plik uruchom.bat ma zawartość

java -jar MOJ_JAR.jar

to nie zostanie uruchomiony MOJ_JAR.jar z katalogu katalog_z_programem. Co więcej, JVM (i uruchomiony JAR, trzeba mieć ogromne szczęście by jakiś się w ogóle uruchomił)
nie ma pojęcia o tym co wpisał użytkownik. Zatem żadne sztuczki, wygóglane skrypty i modły do Allacha nie wyświetlą katalogu katalog_z_programem.

0

Aplikacja uruchamia się za każdym razem :)

Problem polega na tym, że na początku jak startuje aplikacja, w main() odczytuję kilka plików, które są niezbędne do dalszego działania programu. Do tego potrzebuję właśnie ścieżki do katalog_z_programem. Ścieżka względna w opisywanym przeze mnie w tym temacie przypadku nie zadziała, tak samo jak pobieranie bezwzględnej przez pozostałe sposoby które podałem.

Nie ma na to jakiegoś sposobu? JVM na pewno zna ścieżkę do programu, da się ją jakoś wydobyć?

0

Pomyśl trochę, jesteś w katalogu C:\test, wpisujesz na konsoli C:\katalog_z_programem_\uruchom.bat, SO wykonuje polecenia z podanego pliku wsadowego (katalogiem bieżącym jest nadal C:\test). Plik wsadowy zawiera jedno polecenie java -jar moj_jar.jar, jakim cudem JVM ma się domyślić, że chodzi o plik jar z katalogu katalog_z_programem? Nie może się domyślić, typową reakcją jest komunikat Unable to access jarfile ..., uruchomienie się programu oznacza, że w katalogu C:\test jest plik moj_jar.jar. Być może (nie mogę znaleźć tego w dokumentacji), JVM przegląda pewne katalogi w poszukiwaniu pliku moj_jar.jar. Wtedy uruchomi się jakiś przypadkowy jar.

0

Wszystko uruchamia się dobrze, bo użytkownik podaje pełną ścieżkę do bata i nie ma problemu - działa to na każdym systemie, więc nie wiem co się tak dziwisz.

Czyli uważasz, że nie da się tego zrobić z poziomu kodu Java?

0

Pełna ścieżka do bata nie ma żadnego znaczenia. JVM nic nie wie o tym co wpisał użytkownik w konsoli. To, że wyświetlany jest katalog *C:* sugeruje, że uruchamia się jar,
który jest w katalogu *C:*. Twoje przeświadczenie, że uruchamia się jar z katalogu katalog_z_programem jest błędne.

0

Dziwię się, bo nie ma prawa działać. I na wszystkich systemach, które sprawdziłem (windows i linux) nie działa, tzn JVM wyświetla komunikat Unable to access jarfile ....
Uruchamiam batcha (skrypt) z innego katalogu podając pełna nazwę batcha (skryptu), w katalogu z batchem (skryptem) jest plik jar.

0

Problem w tym, ze niepotrzebnie pobierasz sciezke bazowa. Bo w tym momencie pobierany jest userdir czyli aktualny katalog, w ktorym pracuje uzytkownik. Przez to sciezka sie nie zgadza.

 
private BufferedImage Img;
private String ImgSciezka = "img/obrazek.jpg";
...
try {
      Img = ImageIO.read(new File(ImgSciezka));
} catch (IOException ex) { }

W ten sposob jezeli, w katalogu w ktorym jest ten .jar, masz katalog img/obrazek.jpg to wczyta go bez problemu.

0

@rucio71, problem w tym, że nie masz pojęcia o czym piszesz.
Kod

private String ImgSciezka = "img/obrazek.jpg";
...
try {
      Img = ImageIO.read(new File(ImgSciezka));
} catch (IOException ex) { }

korzysta z adresu względnego względem katalogu bieżącego a nie względem katalogu, w którym jest jar. Jeśli katalogiem bieżącym jest katalog jajo,
jar znajduje sie w katalogu kura, a obrazek jest w pliku kura/obrazek.jpg, to po wpisaniu na konsoli polecenia java -jar kura/nazwa_jara
obrazek nie zostanie wczytany.

0

No ale problem, który przedstawiles w pierwszym poscie jest taki, ze jak uruchamiasz z C:\ plik C:\katalog\uruchom.bat. Ja sprawdzilem u siebie czy dziala metoda, o ktorej napisalem nim wrzucilem posta. I w wypadku uruchamiania programu w sposob opisany w Twoim pierwszym poscie, ten sposob, ktory opisalem uruchamia sie i wczytuje obrazki.

0

Jeżeli plik wsadowy uruchom.bat zawiera tylko jedno polecenie java -jar pełna_nazwa_jara, w momencie uruchomienia pliku wsadowego katalogiem bieżącym nie jest katalogiem z jarem i katalog bieżący nie zawiera podkatalogu img z plikiem obrazek.jpg, to Twój kod nie wyświetli obrazka.

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