Parafrazą powyższego tytułu rozpoczyna się pewien wątek na Reddit, na który trafiłem jakiś czas temu. Autor otwiera w nim dyskusję na temat mniej popularnych, aczkolwiek wartościowych bibliotek.
Pomyślałem, że jest to świetny materiał na artykuł. Tak o to powstał wpis, który zbiera niemal 300 odpowiedzi w bardziej ustrukturyzowaną formę i w minimalnej formie przybliża te pozycje. Wszystkie wymienione biblioteki skategoryzowałem, okrasiłem krótkim opisem, dodałem odnośniki. Pełną listę wszystkich bibliotek znajdziesz w spisie treści poniżej. Myślę, że nawet mając kilka lat doświadczenia, nadal kilka pozycji Cię zaciekawi. Zapraszam do lektury.
Bazy danych
HikariCP – pula połączeń do bazy danych
https://github.com/brettwooldridge/HikariCP
HikariCP czyli bardzo lekka (130Kb) i wydajna pula połączeń do bazy danych. W tłumaczeniu z Japońskiego promień świetlny. Nazwa jednoznacznie nawiązuje do szybkości działania tej biblioteki i jak pokazują mikro benchmarki, bynajmniej nie są to słowa rzucone na wiatr.
Reddison – abstrakcja na Redisa
https://github.com/redisson/redisson
Kolejny link związany z tematyką baz, jaki pojawił się w wątku to Redisson. Jest to biblioteka opakowująca API jednej z najpopularniejszych baz typu klucz wartość. Posiada spore możliwości przez nadbudowane abstrakcje, jednak jak słusznie zauważa, jeden z użytkowników czasem niesie to ryzyko przykrycia istotnych szczegółów oryginalnego API, jakie oferuje czysty Redis.
JDBI – czyli ciut więcej niż JDBC
Jeżeli szukasz biblioteki, która zapewni dostęp do bazy danych, ale zależy Ci na pozostaniu blisko świata SQL? JDBI może okazać się ciekawym wyborem. Oferuje nieco większe możliwości niż sam JDBC jak, chociażby zgrabne parametryzowanie zapytań, czy opakowanie wyników do obiektów przy pomocy udostępnionych mapperów. Nie dokłada jednak żadnych zbędnych abstrakcji i nie stara się być kolejnym rozwiązaniem klasy ORM.
Spring Data JDBC – odchudzony Spring Data bez magii JPA
https://spring.io/projects/spring-data-jdbc
Główna myśl, jaka przyświeca tej bibliotece jest zaczerpnięta wprost z kultowej książki Evansa na temat DDD i bazuje na pojęciu agregatu. Agregat to specjalny typ obiektu, który posiada i zarządza cyklem życia, dowiązanych do niego obiektów. Biblioteka ta stara się jak najbardziej pomóc być zgodnym z pomysłami DDD i implementować je w wygodny sposób. W dużej mierze jej użycie przypomina użycie zwykłego Spring Data, definiowania encji oraz interfejsów, ale rezygnuje, chociażby z leniwego ładowania, warstwowych cache’y, czy nie pozwala na jawne zagnieżdżanie mapowanych obiektów, a jedynie posługiwanie się ich identyfikatorami. Ciekawy artykuł z różnicami na ten temat znajdziesz pod tym adresem https://ordina-jworks.github.io/java/2020/01/02/Spring-Data-Jdbc.html
JOOQ – alternatywa dla Hibernate
Jeżeli szukasz dobrego sposobu na dostęp do bazy danych, to kolejna z propozycji, która może przypaść Ci do gustu. Biblioteka oferuje możliwość pisania czystego SQL na poziomie kodu w Javie z pełnym podpowiadaniem składni i walidacją na etapie kompilacji. Autor biblioteki jest też znany z innego projektu o nazwie JOOL, który rozwiązuje problem brakujących elementów Javy 8.
JOOQ to jedna z tych bibliotek, które mocno rekomendowałem i chwaliłem w Poradniku Juniora Java Developera na rok 2021
Tę darmową książkę mojego autorstwa nadal możesz pobrać pod adresem https://niezbednikjuniora.pl
W momencie publikacji tego wpisu książkę pobrało już ponad 1600 użytkowników.
Cayenne – kolejna alternatywa dla Hibernate
To biblioteka ciekawa ze względu na bardzo oryginalne podejście do modelowania klas, które odbywa się przez udostępniony GUI. Obiecuje łatwe przepinanie pomiędzy różnymi silnikami bazodanowymi i niski próg wejścia nawet dla osób nieznających SQL.
MVStore – czyli przechowywanie Mapy poza pamięcią
https://www.h2database.com/html/mvstore.html
Na sam koniec temat, który może nie do końca można nazwać bazą danych ale jest ciekawą opcją do prototypowania lub innych niekonwencjonalnych zastosowań. Jeżeli twoje dane ograniczają się do zwykłej Mapy w Javie, powyższe rozwiązanie powinno Cię zainteresować. To rozwiązanie z rodziny klasy H2, popularnych baz pamięciowych upraszczające jednak cały dostęp do zwykłej mapy.
Budowanie aplikacji
Picocli – narzędzie do budowania aplikacji typu CLI
Pierwszą pozycją sekcji bibliotek ułatwiających tworzenie aplikacji jest Picocli, czyli narzędzie ułatwiające tworzenie aplikacji konsolowych. Biblioteka posiada przyjemną dokumentację i dba o wiele elementów, jakie powinny oferować, wygodne narzędzia CLI. Wspiera zarówno Javę jak i Kotlina.
LWJGL 3 – biblioteka do tworzenia gier i aplikacji desktopowych
Od wielu lat siedzę głównie w aplikacjach webowych, tym z większą ciekawością obserwuję biblioteki z zupełnie innego podwórka. Taką niewątpliwie jest LWJGL. Biblioteka ta posiada bardzo szerokie wspacie oferując dostęp do wielu niskopoziomowych API jak:
EGL, OpenCL, OpenGL, OpenGL ES, Vulkan, GLFW, JAWT, nfd, tinyfd, OpenAL, Opus, Assimp, bgfx, DriftFX, LibOVR, meshoptimizer, NanoSVG, NanoVG, Nuklear, par_shapes, par_streamlines, OpenVR, Shaderc, SPIRV-Cross, Tiny OpenEXR, Tootle (AMD), Vulkan Memory Allocator, Yoga, stb, Bullet Physics, CUDA, dyncall, jemalloc, libdivide, LLVM, LMDB, LZ4, ODBC, Remotery, rpmalloc, xxHash, Zstandard.
Uff wymieniłem przekleiłem wszystkie. Biblioteka oferuje wysoki poziom modularności dzięki czemu nie musisz zaprzęgać całego kombajnu, a dołączyć tylko tę część, której akurat potrzebujemy w naszym projekcie.
Jbang – wykorzystanie Javy do pisania skryptów
Dotarliśmy do mojego faworyta całego zestawienia. Biblioteki, której nie znałem, a wzbudziła u mnie największe zainteresowanie. Pozycja ta oferuje możliwość pisania skryptów w Javie i odpalanie na różnych platformach, nie wymagając przy tym od użytkownika żadnych zależności, wliczając w to samą maszynę wirtualną Javy. Jednym z ciekawych zastosowań jest np. możliwość szybkiego testowania różnych bibliotek czy nowych mechanizmów języka. Warto zerknąć, chociażby na te przykłady https://github.com/jbangdev/jbang-examples
Micronaut – jako alternatywa do stacka Spring Boot
Micronaut średnio wpisuje się definicję biblioteki, o której nikt nie słyszał, bo od jakiegoś czasu dosyć głośno o niej na różnego rodzaju konferencjach. Dla osób, które jednak są mocno zanurzone w świecie Springowym, może wpisywać się w taką definicję. Biblioteka wymieniana jest jednym tchem w parze z GraalVM i Serverlessem, co jest chyba najsilniejszym argumentem, aby bliżej zapoznać się z jej możliwościami.
Testy i jakość
SpockFramework – ulubione narzędzie do testowania
To bez wątpienia jedna z moich ulubionych bibliotek. Bardzo podobał mi się jeden z komentarzy w wątku, który stwierdził, że kto raz spróbował pracy ze Spockiem, nie wróci do żadnej innej biblioteki. Podpisuję się pod nim obiema rękoma. Faktycznie to ta biblioteka, która sprawia, że pisanie testów staje się przyjemnością i aż dziw bierze, że nie zdetronizowała alternatyw w swojej klasie.
Testcontainers – uruchamianie zależnych serwisów w testach jako kontenery
https://www.testcontainers.org/
Pisząc testy integracyjne, możemy pójść drogą mockowania lub skorzystać z możliwości testcontainers, która pomoże nam z zależnościami typu kolejki czy bazy. To jedna z tych bibliotek, która raz użyta na stale pozostaje w arsenale developerskim.
Pitest – testy mutacyjne
Czy są lepsze metryki oceniające ich jakość niż pokrycie kodu testami? Jedną z bibliotek, która udowadnia, że tak jest pitest, czyli całkiem udana próba implementacji idei testów mutacyjnych w Javie.
Mockneat – generator mockowych danych w popularnych formatach
Czasami tego rodzaju wątki przyciągają nie tylk, fanów jakiegoś rozwiązania co również i samych autorów. Tak jest w tym przypadku, gdzie w wątku udzielił się autor rozwiązania Mockneat. Ma ono na celu sprawić, aby generowane dane testowe były nieco lepszej jakości niż dupa8 pozwalając przy tym na bycie zgodnym z jednym z popularnych formatów. Daje ciekawe możliwości generowania danych mogących wprost zasilić bazę SQL, XML, CSV czy jsony.
Projektem o zbliżonej tematyce, ale w formie serwisu jest https://www.mockaroo.com zaś innym projektem skupionym bardziej na samych danych jest https://github.com/Devskiller/jfairy
Error Prone – wyłapywacz prostych błędów
To biblioteka w formie plugin’u podpinanego do jednego z popularnych systemów typu Gradle lub Maven. Działa na poziomie kompilacji kodu i pozwala na wyłapywanie popularnych błędów w kodzie w myśl zasady fail-fast
Ciekawym rozszerzeniem biblioteki jest https://github.com/uber/NullAway
AssertJ – przyjemne w odbiorze asercje w testach
https://assertj.github.io/doc/
To chyba najprzyjemniejszy sposób na asercje. Sprawia, że są one przystępne zarówno w przypadku ich pisania, czytania jak i późniejszej analizie zwracanych rezultatów.
Procesowanie danych
Jsonpath – DSL do czytania jsonów
https://github.com/json-path/JsonPath
Jsonpath jest ciekawym podejściem do czytania plików w tym formacie. Składania jest bardzo prosta, prostsza niż np w popularnym narzędziu jq (o różnicach mozesz przeczytać np tutaj https://github.com/stedolan/jq/wiki/For-JSONPath-users) Pomysł, aby opakować te funkcjonalności w Javie i używać jako biblioteki, może czasem znaleźć zastosowanie, w szczególności, gdy zaczynamy mówić o naprawdę dużych plikach.
Fastexcel – wydajny sposób na generowanie plików excel
https://github.com/dhatim/fastexcel
Chyba najpopularniejszą pozycją łączącą świat javy i Excela jest POI. Fastexcel to rzucona rękawica w jej stronę, udowadniająca, że da się stworzyć narzedzie o wiele bardziej wydajne, zarówno pod względem konsumowanej pamięci i czasu generacji. Poniższe wykresy pokazują, że różnice w standardowym użyciu są ogromne. Poza tym biblioteka jest chwalona, za bardzo prostolinijną abstrakcję.
Roaringbitmap
https://github.com/RoaringBitmap/RoaringBitmap
„Po jakimś czasie wygląda na to, że każdy problem da się rozwiązać, przy użyciu bitmap”
cyt. „Po jakimś czasie wygląda na to, że każdy problem da się rozwiązać, przy użyciu bitmap”
Roaringbitmap jest podwaliną wielu silników indexowania, używa jej między innymi YouTube SQL Engine, Apache Lucene, Solr, Elastic. Rozwiązanie to znajdziesz również w InfluxDB, Bleve i wielu innych popularnych bibliotekach Dobre wytłumaczenie kiedy to rozwiązanie może okazać się przydatne jest tutaj – w wielkim skrócie chodzi o efektywniejsze wykorzystanie zasobów pamięci w skrajnych przypadkach.
Apache Tika – ciekawe narzedzie do analizy zawartości plików
Biblioteka ta rozpoznaje tysiące różnych formatów plików. Wydaje się bardzo przydatna podczas indeksowania, analizy zawartości, tłumaczeniach i wielu innych zastosowaniach, w których kluczową rolę odgrywają metadane i obsługa wielu formatów plików.
Jolt – transformowanie jsonów
https://github.com/bazaarvoice/jolt
Umożliwia konwersję plików json z jednego formatu na inny, w oparciu o schemat zdefiniowany również jako json. W skrócie można o tym rozwiązaniu myśleć jak o xslt dla jsonów.
Zarządzanie kodem
immutables – automatyczne generowanie niemutowalnych obiektów
Problem domyślnej mutowalności w Javie jest znany nie od dziś i rozwiązany np. w Kotlinie. Świetna biblioteka, która powoduje, że możemy temu zaradzić to immutables.
MapStruct – konwersja obiektów
To jeden z przykładów mapperów, jakie pojawiły się w zestawieniu. Cechuje go to, że mapuje obiekty na poziomie kompilacji. Jak trafnie zauważył jeden z użytkowników, należy rozważnie używać tego typu bibliotek przy Hibernate, ponieważ mogą one stanowić mieszankę iście wybuchową.
Eclipse Collections – wysokowydajna implementacja podstawowych struktur
https://www.eclipse.org/collections/
To bardzo ciekawa pozycja alternatywnych kolekcji. Wszędzie tam, gdzie istotną rolę odgrywa zysk w czasach GC i ogólnej wydajności, użycie tego typu kolekcji może być bardzo dobrym pomysłem.
API
Vert.x – lekkie i proste REST API
To ciekawa warta rozważenia alternatywa do Spring Boota. Jeżeli planujesz budowę API RESTowego, Vert.x może być strzałem w dziesiątkę.
Retrofit – http client
Resilience4j – strategie zarzadzania błędami odpowiedzi
https://resilience4j.readme.io/
W gąszczu linków pojawiła się też pozycja dbająca o strategię w jaki sposób będziemy się integrować pomiędzy serwisami. Znajdziesz w niej chociażby implementację wzorca circuit breaker
Wiremock – narzędzie do mockowania API
Dobra biblioteka do symulowania zewnętrznych serwisów, których sami nie kontrolujemy. Znajdzie zastosowanie we wcześniejszych fazach developmentu czy testach.
Metryki
Oshi – czyli twarde metryki z twojej maszyny
Biblioteka to świetny sposób na wyciągnięcie twardych metryk o maszynie na, której uruchamiany jest nasz kod.
Opentelemetry – uwspólnione podejście do tracingu
https://github.com/open-telemetry/opentelemetry-java
Na zakończenie biblioteka, która stara się uporządkować temat śledzenia requestów w architekturze rozproszonej.
Twój wynik?
A teraz tak szczerze, o ilu pozycjach nigdy nie słyszałeś?
Mój wynik to 13/31, chociaż przyznaje bez bicia, że jest też kilka pozycji, które kojarzyłem tylko z nazwy, a nigdy nie miałem z nimi bliższej styczności. Kilka na tyle mnie zaciekawiło, że za jakiś czas z chęcią do nich wrócę i zastosuję przy nadarzającej się okazji.
A może sam wiesz o bibliotekach, które nie zostały tutaj zawarte, a powinny? Podziel się, proszę w komentarzu.
Żródło: https://www.reddit.com/r/java/comments/jfdnnd/what_are_some_great_java_libraries_im_probably/