Java, SWT i uruchomienie z pliku JAR (Ubuntu i Windows)
lipiec 21, 2008 — morituriusPokombinował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.
Konsola do AGE wreszcie skończona. Na początek zmagałem się z obsługą wyświetlania, dodawania linii i opcjami takimi jak “przewijanie” konsoli i czyszczenie ekranu konsoli. Następnym krokiem było wprowadzanie komend do konsoli. Tutaj na początku wydawało mi się to bardzo trudne ze względu na to że musiałbym sobie sam zakodować obsługę klawisza SHIFT. Tutaj jednak z pomocą przyszedł mi unikod. Można go w SDLu włączyć za pomocą wywołania:
Ostatnio niewiele miewam czasu na programowanie dla siebie więc i postęp prac jest raczej marny. Główna zmiana jaka nastąpiła to pozbycie się GLUT na rzecz SDL do spółki z OpenGL. Postanowiłem wykorzystać jednak SDL ze względu na to, że mam więcej dane z urzędu bez straty wieloplatformowości.