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.
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
@Kurak: może to stare powiedzenie – jeszcze z przed czasów .NET
(btw.: to brzmi jak “Pamiętam jak przed wojną…”)
Nigdy nie powinieneś pakować plików jar do swoich bibliotek!
Zawsze załączaj je jako osobne biblioteki!
@Tomasz: warto byloby jeszcze napisac co jest w tym zlego ^^