Twitter: @grzegg
Kategoria: java, Tagi: - - - .

Java [27] – Pakiety, biblioteki

Dotychczas używając NetBeans w zasadzie zawsze umieściliśmy pliki programów w pakietach. Dzisiaj przyjrzymy się im bliżej. Dowiemy się także jak je przenosić między programami.

Tworzenie plików jar

Pakiety, jak sama nazwa wskazuje, są strukturami pozwalającymi gromadzić pliki, które są ze sobą w jakiś sposób powiązane. Zazwyczaj tworzą jeden program ale też może to być zbiór klas służących wykonaniu określonego zadania, niekoniecznie funkcjonujących samodzielnie. Na przykład w pakiecie mogą się znaleźć klasy przeznaczone do obliczeń statystycznych, albo do tworzenia wykresów czy też pomocnych w przeprowadzaniu symulacji ewolucji organizmów. W każdym razie powinny stanowić jakąś logiczną całość.

Fizycznie pliki znajdujące się w jednym pakiecie znajdują się w jednym folderze. Na przykład zajrzyj do katalogu w którym znajduje się projekt Interfejsy, który tworzyliśmy w poprzedniej lekcji. Jeśli z jakichś powodów nie masz tego projektu na swoim dysku, pobierz plik ze spakowanym projektem klikając tutaj, następnie rozpakuj plik Interfejsy.zip. Powstały katalog możesz przenieść w miejsce gdzie przechowujesz projekty NetBeans. W katalogu Interfejsy znajdziesz katalog src a w nim katalog interfejsy, który jest właśnie katalogiem pakietu i w nim znajdują się wszystkie stworzone klasy.

Przy okazji możesz zauważyć, że w katalogu z projektem znajduje się m. in. także katalog build a w jednym z podkatalogów znajdują się skompilowane pliki, dzięki czemu możemy uruchomić program z linii komend. Była to tym mowa na pierwszej lekcji. Opisany tam sposób nie należy jednak do szczególnie praktycznych. Znacznie łatwiej jest spakować program w pliku jar, który łatwo poznać po tym, że ma właśnie takie przedłużenie nazwy. Użyjemy do tego NetBeans, choć oczywiście nie jest to absolutnie konieczne.

Najpierw jednak otwórz projekt Interfejsy w NetBeans (o ile już nie jest otwarty). W tym celu wybierz z menu NetBeans:
File -> Open project a następnie w okienku dialogowym wybierz z odpowiedniego miejsca na dysku (w którym znajduje się katalog z projektem) projekt Interfejsy. Powinien pojawić się w okienku z otwartymi projektami.

Sprawdź czy program działa, jeśli tak to przystąpimy do spakowania go do pliku jar. Mając zaznaczony projekt kliknij w menu Run -> Clean and Build Project, możesz też użyć ikony z młotkiem i miotełką. Po tej czynności w katalogu z projektem powinien się pojawić katalog dist a w nim plik Interfejsy.jar oraz README.TXT, który jak sama nazwa wskazuje warto przeczytać, zawiera bowiem szczegóły uruchamiania i rozpowszechniania naszego programu. W skrócie, jeśli chcemy uruchomić program należy w linii komend wejść do katalogu dist i wykonać komendę:


java -jar Interfejsy.jar

i program powinien się uruchomić.

Jeśli chcesz możesz przenieść plik Interfejsy.jar w dowolne inne miejsce i tam go uruchamiać. Jeśli będziesz miał bardziej złożony program, i w katalogu dist pojawią się katalogi (lib) i inne pliki to należy skopiować cały katalog dist z zawartością w miejsce gdzie chcemy używać programu.

Dołączanie zewnętrznej biblioteki

Projekt może zawierać wiele pakietów, może też być tak, że chcemy użyć w naszym programie wcześniej napisanego pakietu, czy biblioteki (biblioteka stanowi zwykle większą całość, zawierającą wiele pakietów). W takim przypadku można dołączyć go np. w formie pliku jar. Pokażę to na przykładzie pliku Interfejsy.jar, który przed chwilą stworzyłeś a później biblioteki którą pobierzemy z internetu.

Utwórz nowy projekt Pakiety a w nim klasę Pakiety. Teraz klikając prawym klawiszem myszy na nazwie projektu wybierz „Properties…”. Pokaże się okno, w którym wybierz po lewej „Libraries” a następnie po prawej kliknij w przycisk „Add JAR/Folder”. Pojawi się kolejne okienko w którym wybierz (z odpowiedniego miejsca na dysku) plik Interfejsy.jar.

Zauważ, że w podkatalogu Libraries projektu, pojawił się plik Interfejsy.jar.


Teraz klasy zawarte w tym pliku (tak naprawdę jest to spakowany katalog) możemy wykorzystać w projekcie Pakiety. W metodzie main klasy Pakiety dodaj kod, dołącz także komendę import:

Uruchom program. Jak widać można teraz korzystać z kodu, który stworzyliśmy w zupełnie innym programie.

W tym miejscu warto zwrócić uwagę na to, że warto oddzielać kod (np. do osobnych pakietów, bibliotek), który stanowi pewną całość, choć niekoniecznie działającą samodzielnie. Na przykład jeśli planujesz napisanie programu, w którym będziesz przeprowadzać symulacje jakiś procesów biologicznych, umieść klasy odpowiedzialne wyłącznie za obliczenia w jednym pakiecie/bibliotece a w innym kod odpowiedzialny za interakcję z użytkownikiem w terminalu. Jeśli po pewnym czasie stwierdzisz, że chcesz napisać nową wersję programu, tym razem wyposażoną w interfejs graficzny, po prostu podłączysz do niego gotowy pakiet konieczny do wykonania obliczeń.

Pobieramy bibliotekę z internetu

Zanim zabierzemy się do pisania kodu warto rozejrzeć się w Internecie, czy aby już ktoś nie napisał i nie udostępnił kodu, który możemy wykorzystać. Jeśli ktoś na przykład stworzył już kod do obliczeń statystycznych, to po co pisać go jeszcze raz? Teraz, właśnie na przykładzie biblioteki Apache Commons Math pokażę jak taki kod pobrać i wykorzystać we własnym programie.

Zacznijmy od wejścia na stronę http://commons.apache.org/proper/commons-math/download_math.cgi. Jest to strona z której można pobrać wspomnianą bibliotekę. Wybieramy plik w sekcji „Binaries” z najnowszą wersją, w momencie pisania tego tekstu jest to commons-math3-3.4.1-bin.zip.

Pobrany plik warto umieścić w osobnym katalogu, w którym będziemy trzymać użyteczne biblioteki zewnętrzne a następnie rozpakować. Po rozpakowaniu powstanie katalog o nazwie odpowiadającej nazwie i wersji biblioteki, w tym przypadku commons-math3-3.4.1. Zajrzyj do jej zawartości. Znajdują się tam dwa pliki jar, katalog docs oraz trzy pliki tekstowe zawierające informacje na temat pakietu i licencję. W katalogu docs znajduje się katalog apidocs a w nim dokumentacja (otwóż w przeglądarce plik index.html). Dwa wspomniane pliki jar to commons-math3-3.4.1.jar z interesującą nas biblioteką oraz commons-math3-3.4.1-javadoc.jar zawierającą dokumentację, którą także wykorzystamy za chwilę.

Teraz utwórz w NetBeans nowy projekt, nazwij go Obliczenia a w nim klasę Obliczenia z metodą main.
Następnie powtórzymy to co robiliśmy przed chwilą. Naciśnij prawym klawiszem myszy na nazwie projektu i z menu wybierz „Properties”, sekcję „Libraries” i wciśnij przycisk „Add Jar/Folder”. Wybierz plik commons-math3-3.4.1.jar i zatwierdź ale nie zamykaj jeszcze okna „Properties”. Teraz przy zaznaczonym w okienku świeżo dodanym pliki kliknij na klawisz „Edit”.


Pokaże się okienko, w którym przy rzędzie „Javadoc” kliknij w „Browse…” a następnie wybierz plik commons-math3-3.4.1-javadoc.jar.


Zatwierdź wszystko. Dzięki dołączeniu pliku z dokumentacją, będziesz mógł korzystać z wbudowanego w NetBeans systemu pomocy także dla dołączonej biblioteki.

Czas umieścić w klasie Obliczenia kod wykorzystujący niewielką część możliwości oferowanych przez dołączoną właśnie bibliotekę.

Jak widać, i co można sprawdzić w dokumentacji, biblioteka Apache Commons Math wiele klas pozwalających przeprowadzanie m. in. testów statystycznych. Na stronie z której pobraliśmy ją możemy też znaleźć podręcznik użytkownika, warto go przejrzeć aby zapoznać się z jej możliwościami i sposobami użycia.

Struktura biblioteki

Gdybyśmy rozpakowali plik jar (możesz to zrobić używając programu do rozpakowywania skompresowanych plików) pojawiłby się katalog zawierający trzy inne katalogi z których najbardziej nas interesuje folder org. Po zajrzeniu do środka, zobaczylibyśmy dość złożoną strukturę katalogów i plików:


Porównaj ją z fragmentem powyższego kodu odpowiedzialnego za import klas:


import org.apache.commons.math3.stat.StatUtils;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
import org.apache.commons.math3.stat.inference.TestUtils;

Okazuje się, że nazwy pakietów odpowiadają strukturze katalogów. Na przykład klasa StatUtils jest częścią pakietu org.apache.commons.math3.stat i prowadzi do niego ścieżka: org/apache/commons/math3/stat. Tak więc poszczególne części nazwy pakietów oddzielne kropkami odpowiadają kolejnym podkatalogom. Jeszcze jedna rzecz mogła zwrócić Twoją uwagę.

Struktura katalogów (i nazwa pakietów) w powyższym przykładzie wygląda ja adres internetowy, tyle, że w odwrotnym kierunku. To często spotykana praktyka, pozwalająca uniknąć konfliktu nazw między pakietami i klasami. Jeśli na przykład przyszło by mi do głowy stworzyć klasę o nazwie StatUtils a w niej metody nawet o takiej samej nazwie jak w powyższej bibliotece, mógłbym ją umieścić w pakiecie pl.ggoralski. Jeśli obie klasy zostałyby wykorzystane w jednym programie, można by je łatwo odróżnić używając pełnej nazwy: org.apache.commons.math3.stat.StatUtils.mean(dane) oraz pl.ggoralski.StatUtils.mean(dane).

Warto też zauważyć, że można pominąć powyższe komendy importu, ale wtedy także należałoby używać pełnej ścieżki do klasy. Zaimportowanie klasy pozwala zatem posługiwać się samymi nazwami metod. Z drugiej strony jeśli chcemy zaimportować wszystkie klasy z danego pakietu, można użyć znaku *. Na przykład:


org.apache.commons.math3.stat.*;

zaimportuje wszystkie klasy znajdujące się w pakiecie stat (ale nie znajdujące się w podkatalogach).

Leave a Reply