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.

Reklamy

8 myśli nt. „Java, SWT i uruchomienie z pliku JAR (Ubuntu i Windows)

  1. 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. @Kurak: może to stare powiedzenie – jeszcze z przed czasów .NET 😉
    (btw.: to brzmi jak „Pamiętam jak przed wojną…”)

    • Problemem nie było uruchomienie pliku JAR tylko uruchomienie pliku JAR, który korzysta z bibliotek JNI. Po prostu brakowało ścieżki do natywnych bibliotek od SWT.

  3. Właśnie dokładny problem spędza mi sen z powiek! Już myślałem, że rozwiązanie jest w zasięgu ręki, postąpiłem dokładnie jak w powyższej instrukcji i niestety nadal plik *.jar nie chce hasac ;/ Czy mógłbym się odezwać do autora artykułu jakoś na priv, żeby mógł bezpośrednio mnie pokierować i powiedzieć co robię nadal źle? Bardzo uprzejmie proszę.

Skomentuj

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

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s