Kontynuujemy wątek dotyczący pakietów, aby traktować go jako drugi krok do tego, jak należy PRAWIDŁOWO ręcznie kompilować kod źródłowy w języku Java. Proszę o cofnięcie się wstecz jeśli nie przerobiliście tamtego etapu, jest on kluczowy, żeby zrozumieć, a także utworzyć własny archiwum JAR w języku Java. Zapraszam.
Tweet |
CZYM JEST ARCHIWUM JAR W JĘZYKU JAVA?
"JAR" to skrót od wyrażenia "Java ARchive File", czyli "plik archiwum Javy". Ze względu na kalambur, kojarzy się większości ze "słoikiem" przechowującym nasz program. To jest nic innego jak wypakowalne archiwum podobne do "zip" albo "rar". Jest ono tworzone w celu scalenia wszystkich niezbędnych plików (nie tylko klasowych, ale również takich jak grafika czy dźwięk) i potraktowania jak jeden wielki plik wykonywalny ".exe" (chociaż to wciąż nie to samo). Należy odróżniać archiwum JAR od pliku wykonywalnego i nie stawiać między nimi znaku równości!
Plik wykonywalny oprócz rozszerzenia, wyróżnia się również kodem startowym, który dostosowany jest do konkretnego systemu operacyjnego. W praktyce oznacza to, że tylko system Windows przyjmie rozszerzenie ".exe" i każdy inny system operacyjny "zadaje się" z własnym konkretnym rozszerzeniem. Natomiast w przypadku pliku JAR, występuje niezależność platformowa czyli nie musimy się przejmować tym, że aplikacja zadziała tylko pod dany OS. Wystarczy się upewnić, że dany system operacyjny posiada zainstalowaną Javę w tej samej wersji, w której ta aplikacja została napisana!
"Java ARchive File" skracane do "JAR" jest wypakowalnym archiwum programu w języku Java symulującym plik wykonywalny (aplikacja może być uruchomiona po dwukrotnym kliknięciu myszą). System operacyjny musi mieć zainstalowane JRE (lub JDK) w celu uruchomienia takiej aplikacji.
PODZIAŁ NA DWA KATALOGI
W dalszym toku artykułu pokażę Wam jak wygląda zawartość takiego archiwum JAR. Koniec poprzedniej części oznacza kontynuację kolejnych czynności od tego miejsca. Musimy trochę zmodyfikować naszą strukturę katalogów i oddzielić pliki klasowe (z rozszerzeniem ".class") od źródłowych (z rozszerzeniem ".java") pakując je do osobnych katalogów. W pierwszej kolejności, usuńcie wszystkie pliki klasowe z rozszerzeniem ".class" (znajdują się one w tym samym miejscu, co pliki źródłowe). Następnie cofnijcie się do folderu stanowiącego "korzeń" projektu (folder przechowujący folder o nazwie "X") i utwórzcie sobie dwa nowe katalogi o dowolnych nazwach, które będą przeznaczone do osobnego przechowywania plików źródłowych i plików klasowych.
Ja nadam nazwę "code" dla plików źródłowych oraz "classes" dla plików klasowych (i od tej pory takim nazewnictwem będziemy sobie to odróżniać), natomiast to nie jest żaden obowiązek, archiwum JAR sobie poradzi. Wpakujcie folder "X" do katalogu "code", a następnie uruchomcie wiersz poleceń (najlepiej z uprawnieniami administratora), przejdźcie do lokalizacji folderu "code" za pomocą "cd" i wprowadźcie bezbłędnie poniższą komendę:
javac -d ../[nazwa katalogu dla plików klasowych] [X]/[Y]/[nazwa pliku źródłowego].java
To jest pierwszy etap drogi do prawidłowego tworzenia archiwum JAR. Kompilator "javac" posiada parametr "-d" pozwalający na przeniesienie skompilowanych plików klasowych do odrębnego katalogu. Co więcej, utworzy w nim automatycznie taką samą strukturę podfolderów, jakie występują w folderze "code" zgodnie z ciągiem pakietów.
PLIK MANIFESTU DLA ARCHIWUM JAR
Od tej pory, robi się mniej wesoło. Aby archiwum JAR działał bez żadnych wygłupów, potrzebuje jeszcze jednej rzeczy. Musimy mu dostarczyć "manifest". To jest plik tekstowy zawierający informacje o punkcie startowym naszej aplikacji. Chodzi o podanie bezbłędnej nazwy klasy, w której znajduje się metoda "main" rozpoczynająca działanie aplikacji. Co więcej, ten ciąg musi ściśle trzymać się struktury katalogów reprezentujących pakiety. Zaraz zobaczycie jak to ma wyglądać.
Po upewnieniu się, że pliki klasowe zostały "dostarczone" do folderu "classes", przechodzimy do niego i tam, gdzie jest folder "X", tworzymy sobie nowy plik tekstowy i nazywamy go "manifest". Tym razem nazwa jest OBOWIĄZKOWA! Wejdźcie do niego i wprowadźcie następującą linijkę określającą punkt startowy aplikacji (z uwzględnieniem struktury katalogowej!):
Main-Class: [X].[Y].[nazwa pliku źródłowego zawierającą statyczną metodę "main"]
Teraz bardzo ważna rzecz! Zaraz po wpisaniu powyższej instrukcji, KONIECZNIE naciśnijcie klawisz Enter celem przejścia do nowej linii i dopiero wtedy zapiszcie. Brak pustego wiersza na końcu skutkować będzie błędami podczas procesu budowy archiwum JAR!!!
Powróćcie teraz do wiersza poleceń, cofnijcie się do folderu głównego ("cd ..") i przejdźcie do katalogu "classes". Będąc tam, wprowadźcie poniższe polecenie:
jar -cvmf manifest.txt [nazwa archiwum JAR].jar [X]
Jest to kolejne narzędzie JDK służące do budowania własnego archiwum wypakowalnego. Po podaniu bezbłędnej nazwy pliku manifestu oraz jego rozszerzenia, dajecie po spacji dowolną nazwę Waszego pliku JAR, który zostanie utworzony. O wiele ważniejsze jest wstawienie nazwy katalogu stanowiącego początek "łańcucha" pakietów. Dzięki temu, możliwe jest uniknięcie wprowadzania wielu nazw pakietów. Java sobie poradzi ze znalezieniem wszystkich plików klasowych i osadzeniem ich do jednego miejsca. Jeśli interesuje Was działanie poszczególnych flag po słowie "jar", sięgnijcie do oficjalnej dokumentacji i zejdźcie do nagłówka "Options".
URUCHOMIENIE PLIKU ARCHIWUM JAR W JĘZYKU JAVA
Ostatnia część artykułu to uruchamianie. Mając otwarty wiersz poleceń wpisujemy:
java -jar [nazwa archiwum JAR].jar
To odszuka Wasze archiwum, wejdzie do pliku "manifestu" i zasugeruje się wpisem "Main-Class" podanym wcześniej. Jeśli wpisaliście prawidłowy ciąg według podanego wzoru, na ekranie terminala pojawi się treść komunikatu jaka była poprzednio.
Drugim sposobem jest możliwość odpalenia programu klikając dwa razy lewym przyciskiem myszki na archiwum, tak jak byście otwierali plik wykonywalny. Jednak w naszym przypadku to nie da żadnego efektu, gdyż komunikat dotyczy tylko okna terminala. Aby ujrzeć efekt pojawienia się programu "na żywo", trzeba sobie zbudować dowolną strukturę graficznego interfejsu użytkownika przy pomocy "Swing" lub "JavaFX".
Tak się prawidłowo buduje i wdraża własny archiwum JAR. Może w dzisiejszych czasach to już nie jest takie powszechne z racji tego, że narzędzia do programowania w Javie odwalają czarną robotę za nas, niemniej jednak warto wiedzieć co nieco o ręcznym procesie budowy takiego pliku. Dwie kluczowe sprawy jakie muszą zostać w głowie to po pierwsze primo, odpowiednia segregacja klas i umieszczenie ich w pakietach, a po drugie primo, opakowanie wszystkiego w jedno wykonywalne archiwum. Niniejszy wniosek zamyka rozdział o archiwum JAR.