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

Odpowiedz Nowy wątek
2011-07-07 17:01
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.

edytowany 2x, ostatnio: _nick_, 2011-07-07 17:15

Pozostało 580 znaków

2011-07-07 17:41
bo
0

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

Pozostało 580 znaków

2011-07-07 17:50
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.

Jednak chodzi o tak banalne rzeczy. z 3 programistami się nad tym zastanawiamy =>tym razem ilość nie przeszła w jakość. - bogdans 2011-07-08 07:32

Pozostało 580 znaków

2011-07-07 18:22
::.
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?

Pozostało 580 znaków

2011-07-07 18:33
bo
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 ....

Pozostało 580 znaków

2011-07-07 22:21
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).

Pozostało 580 znaków

2011-07-08 07:22
bo
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.

Pozostało 580 znaków

2011-07-08 09:19
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ć?

Pozostało 580 znaków

2011-07-08 10:47
bo
0

Pomyśl trochę, jesteś w katalogu C:\test, wpisujesz na konsoli C:\katalog_zprogramem\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.

Pozostało 580 znaków

2011-07-08 10:58
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?

Pozostało 580 znaków

2011-07-08 11:16
bo
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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