Java, SWT i uruchomienie z pliku JAR (Ubuntu i Windows)

Pokombinowałem troche, poczytałem fora internetowe poczytałem różne artykuły na temat tego w jaki sposób uruchomić stworzony przez Eclipse plik JAR.

Wszystko na marnę.

Dziś rano jednak pomyślałem, że musi być jakieś prostsze rozwiązanie – bo widziałem jedno które miało 10k kroków, a wyjaśnione było tak, że zgubiłem się już po drugim.

Ubuntu

Moim problemem w Linuxie było to, że nie java.library.path nie zawierała ścieżki do Java Native Interface (JNI) zatem wystarczyło tylko dodać do polecenia uruchomieniowego jedną rzecz:

java -Djava.library.path=/usr/lib/jni helloworld.jar

Takie wklepywanie jest jednak uciążliwe, a przy uruchamianiu aplikacji przez dwuklik na ikonie – wręcz niemożliwe. Dlateg – jak zawsze – można (nawet trzeba) to sobie uprościć.

Okazuje się, że wystarczy ustawić zmienną LD_LIBRARY_PATH tak aby zawierała wspomnianą ścieżkę /usr/lib/jni.

“Wystarczy” to za mało. W ubuntu niełatwo jest ustawić tę zmienną – nie potrafię wyjaśnić dlaczego tak jest bo sam tego nie wiem. Wiem natomiast, że zadziałało utworzenie w katalogu użytkownika pliku .bashrc i wpisanie do niego nastepującej treści pomogło:

LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":/usr/lib/jni
export LD_LIBRARY_PATH

Od teraz po wykonaniu polecenia env w liście zmiennych widać LD_LIBRARY_PATH ustawioną w odpowiedni sposób.

Windows

W windowsie z kolei wszystko “prawie” działa. Problemem nie są dzielone biblioteki tylko brak pewnych rzeczy w pliku jar z programem. U mnie objawiało się to okienkiem informującym mnie, że nie można znaleźć głównej klasy do uruchomienia czy coś w ten deseń. Tak czy inaczej – nie to było problemem.

Po wyeksportowaniu programu z Eclipse do pliku *.jar i otworzeniu go w jakimś WinZIPie czy innym programie do rozpakowywania znajduje się tam kadalog META-INF, pliki .classpath i .project oraz pliki *.class (u mnie był jeden – Main.class). Te pliki nie są interesujące. Bardziej ciekawe jest to co dzieje się w katalogu META-INF. Jest tam plik MANIFEST.MF.

Otworzyłem MANIFEST.MF i moim oczom ukazało się coś takiego:

Manifest-Version: 1.0
Main-Class: Main

Wpadłem więc na pomysł, aby ściągnąć z www.eclipse.org/swt wersję SWT dla Windows i ze ściągniętego ZIPa wydostać plik swt.jar. Później wystarczy wrzucić go do naszego pliku *.jar, który chcemy uruchomić (do głównego “katalogu” – tam gdzie pliki *.class) i dodać do pliku MANIFEST.MF jedna linię:

Class-Path: swt.jar ./

I tyle wystarczy. Po tym zabiegu wystarczyło tylko dwa razy kliknąć na plik *.jar i uruchamiało się okienko o które chodziło.

, , , ,

  1. #1 by Kurak on Lipiec 21, 2008 - 2:57 pm

    No patrz, a w takim .NET wystarczy kliknac 2 razy na EXE (windows) albo wklepac mono plik.exe (linux) ;) A mowia ze z Java jest mniej problemow ;)

  2. #2 by moriturius on Lipiec 21, 2008 - 5:32 pm

    @Kurak: może to stare powiedzenie – jeszcze z przed czasów .NET ;)
    (btw.: to brzmi jak “Pamiętam jak przed wojną…”)

  3. #3 by Tomasz on Sierpień 9, 2008 - 3:36 pm

    Nigdy nie powinieneś pakować plików jar do swoich bibliotek!
    Zawsze załączaj je jako osobne biblioteki!

  4. #4 by moriturius on Sierpień 9, 2008 - 4:42 pm

    @Tomasz: warto byloby jeszcze napisac co jest w tym zlego ^^

  5. #5 by leppakaklifoth on Styczeń 2, 2012 - 7:30 pm

    Przejdź pod ten adres, tam znajdziesz wszystkie odpowiedzi – http://czytelnia.ubuntu.pl/index.php/2008/01/22/swt-java/

Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Zmień )

Twitter picture

You are commenting using your Twitter account. Log Out / Zmień )

Facebook photo

You are commenting using your Facebook account. Log Out / Zmień )

Connecting to %s

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.