W tym artykule przybliżę samo pojęcie bibliotek, sposoby wykorzystania, ich różne formy oraz przedstawię najbardziej popularne, jak również najczęściej wykorzystywane biblioteki.

Wstęp

Wiedząc już z innego artykułu, że sam język Java, to za mało, tym razem musimy przygotować się na ogrom narzędzi, bibliotek, framework’ów, które są dostępne dla języka Java i które wspierają pracę programisty, programistki Java.

Obecnie programista, programistka Java pisząc kod aplikacji korzysta z innych klas Java, które również korzystają z innych klas Java. Pomiędzy klasami tworzą się zależności. Większą liczbę klas dla projektu umieszcza się w bibliotekach, które mogą być używane przez innych programistów.

Ciężko jest znaleźć kod, który nie składa się z innych klas chyba, że jest, to Hello World!. Nawet w obrębie własnej aplikacji korzystamy z kilku własnych klas, jeżeli tak nie jest, to zapewne łamiemy zasadę Single Responsibility z SOLID.

Jeżeli mamy więcej niż jedną klasę w projekcie, to z takiego projektu tworzymy plik JAR, czyli bibliotekę, która będzie zawierać skompilowane i gotowe klasy do wykorzystania przez innych programistów. Większość przydatnych bibliotek można pobrać z Maven Repository.

Różnice między pojęciami

Zanim przedstawię listę bibliotek i framework’ów wyjaśnię różnicę pomiędzy tymi pojęciami. Zarówno biblioteka jak i framework są dodawane do projektu jako zależności, przez zależności rozumiemy zbiór klas dostępnych w postaci pliku JAR.

Biblioteka

Nie wnikając w szczegóły techniczne biblioteka jest czymś z czego korzystamy, co używamy w naszym projekcie, daje nam narzędzie do rozwiązania konkretnego zadania, np. operacje na tekście.

Framework

Jest czymś, co daje szablon, który wypełniamy i który korzysta z naszych klas, zarządza nimi i daje cały zestaw narzędzi wspomagających realizację naszego zadania, np. tworzy za nas obiekty, wyświetla graficzny interfejs użytkownika.

Narzędzia

Jak na razie nie wspomniałem nic o narzędziach, przedstawiłem jedynie biblioteki i framework’i. Narzędzia wspomagające pracę programisty Java w większości przypadków są oddzielnymi aplikacjami, które mają własny interfejs użytkownika (graficzny, tekstowy), komendy, polecenia. Aplikacje te są instalowane oddzielnie lub w postaci wtyczek np. do przeglądarki, IntelliJ IDEA IDE. Narzędzia ułatwiające pracę programisty:
Postman,
– Przeglądarka internetowa w trybie programisty,
GitHub – zdalne repozytorium git.

Przykłady

Powyżej podałem kilka przykładów narzędzi programistycznych. Poniżej pokażę kilka przykładów bibliotek oraz framework’ów.

Biblioteka

Wartą uwagi biblioteką jest Lombok, który pozwala nam zaoszczędzić czas i pracę przy pisaniu powtarzalnego kodu dla klas POJO, automatycznie generuje za nas np. konstruktory, metody get/set, metodę toString(). Bardzo popularne są biblioteki tworzone przez fundację Apache, można wymienić między innymi Apache Commons. Przydatna jest również biblioteka ModelMapper, która ułatwia proces mapowania jednej klasy na inną klasę.

Framework

Przykładem framework’u jest JUnit, który wspomaga testowanie naszego kodu. Jest to najbardziej popularny framework do testów kodu w języku Java, istnieją inne, takie jak np. Selenium, TestNG, Mockito. Najbardziej popularnym framework’iem jest Spring framework, opis tego framework’u wybiega poza ten artykuł, zapraszam do zapoznania się z oficjalną dokumentacją Spring Framework oraz informacjami na Wikipedii.

Jak wybrać bibliotekę, framework?

Jak znaleźć i wybrać odpowiednią dla nas bibliotekę lub framework? Po lekturze tego artykułu jasno i wyraźnie widać, że nie łatwo jest odnaleźć się w gąszczu dostępnych bibliotek i framework’ów. Kiedy ja szukam biblioteki, to tak na prawdę szukam rozwiązania jakiegoś problemu, a biblioteka pojawia się “przy okazji” przykładu rozwiązania danego problemu. Mówi się, że w języku Java istnieje już rozwiązanie danego problemu i w większości przypadków takie rozwiązanie jest na tyle uogólnione, że występuje w postaci biblioteki lub framework’u.

Dependencies, czyli zależności

Na koniec przedstawię listę zależności, bibliotek, które możemy dodać do “startera” aplikacji opartej na Spring Framework. Prosta aplikacja web (Spring MVC + Thymeleaf) z możliwością utrwalania danych (Spring Data JPA). Dlaczego o tym piszę? Po dodaniu poniższych 4 zależności otrzymujemy około 90 bibliotek, z których te cztery dodane biblioteki korzystają – prawdziwe morze zależności!

spring-boot-starter-web
spring-boot-starter-thymeleaf
spring-boot-starter-data-jpa
spring-boot-starter-test

Poniżej wspomniane wcześniej zależności dla prostej aplikacji napisanej z wykorzystaniem Spring Framework – Maven dependencies.

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
Jak nie utonąć w morzu technologii związanych z językiem Java? Biblioteki, Frameworki, narzędzia - Mentor Junior Java Developer
Jak nie utonac w morzu technologii zwiazanych z jezykiem Java? Biblioteki, Frameworki, narzedzia – Mentor Junior Java Developer

Poniżej wspomniane wcześniej zależności dla prostej aplikacji napisanej z wykorzystaniem Spring Framework – Gradle dependencies.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.3.5'
    implementation group: 'org.projectlombok', name: 'lombok', version: '1.18.8'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation group: 'com.h2database', name: 'h2', version: '1.4.199'

    testImplementation 'org.junit.jupiter:junit-jupiter-api'
}

Poniżej zależności dla bibliotek, o których wspomniałem w przykładach powyżej – Gradle dependencies.

dependencies {
    implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.3.5'
    implementation group: 'org.projectlombok', name: 'lombok', version: '1.18.8'

    testImplementation group: 'com.h2database', name: 'h2', version: '1.4.199'

    testImplementation 'org.junit.jupiter:junit-jupiter-api'
}