Wprowadzenie do Apache Commons

Oczywiście zacznijmy od historii!

Wszystko zaczęło się w 1999 roku od rejestracji „Apache Group” w imieniu Apache Software Foundation (ASF). Projektem wspieranym przez fundację był serwer WWW Apache HTTPD tworzony w latach 1995-1999.

Tak samo było z projektem Jakarta (projekt Jakarta), który powstał w wyniku współpracy Sun Microsystems, IBM, Oracle i chłopaków z Apache. A w 2001 roku podczas pracy zespół programistów zauważył, że często piszą tę samą funkcjonalność, czasem po prostu kopiują ją od siebie. Taki kod nazywa się płytą kotłową. Udało im się zebrać dużą ilość kodu, który pomógł programistom, ale nie było biblioteki do jego przechowywania.

Tak narodził się projekt Jakarta Commons, w którym dodano komponenty Javy (głównie w oparciu o istniejący kod). Projekt został później przemianowany na Apache Commons.

Mówiąc szerzej, Apache Commons to „duży zbiór małych narzędzi Java”. Jest używany w wielu projektach open source.

Narzędzia Apache Commons są sercem projektów, takich jak Apache Tomcat, Struts, Hibernate i inne.

Oczywiście to wszystko da się podłączyć ręcznie, bez systemu budowania (Maven, Gradle), ale my tego nie zrobimy i po prostu dodamy je do naszego projektu.

Aby pracować z Mavenem, najpierw dodaj odpowiednią zależność:

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>${apache.common.version}</version>
</dependency>

Gdzie ${apache.common.version} to wersja tej biblioteki.

Dla Gradle (Groovy):

implementation 'org.apache.commons:commons-lang3:3.12.0'

Popularne biblioteki Apache Commons

Oto lista najczęściej używanych klas i metod:

Apache Commons: lang

Ta biblioteka zawiera następujące pakiety:


Packages
org.apache.commons.lang
org.apache.commons.lang.builder
org.apache.commons.lang.enum
org.apache.commons.lang.enums
org.apache.commons.lang.exception
org.apache.commons.lang.math
org.apache.commons.lang.mutable
org.apache.commons.lang.reflect
org.apache.commons.lang.text
org.apache.commons.lang.time

Tutaj możesz wygodnie i szybko pracować ze stringami, odbiciem, serializacją, obiektami i systemem. Zwróćmy uwagę na najczęściej stosowane metody:

StringUtils

Ogromna liczba metod manipulowania ciągami znaków.

  • is(Not)Blank/Empty(String) - czas zapomnieć o tego typu sprawdzaniu: if (s!=null && s.trim().length()>0) , a tu jest dobry zamiennik

StringEscapeUtils

  • (un)escapeSql(String) - Zastąp PreparedStatment
  • (un)escapeHtml(String) - do przetwarzania wartości z HTML

ToStringBuilder

  • odbicieToString(Object) to implementacja metody toString() oparta na odbiciu. Gdy usuniesz pole za pomocą odbicia, wynik metody ulegnie zmianie.

EqualsBuilder i HashCodeBuilder

  • ReflectionEquals/HashCode(Object) to dobry zamiennik automatycznego generowania, który ma swoją zaletę: te dwie metody uwzględniają zmiany strukturalne obiektu podczas działania, np. dodawanie pól

Narzędzia wyjątku

  • getFullStackTrace(Throwable) - wypisuje cały StackTrace jako ciąg znaków

Apache Commons: kolekcje

Packages
org.apache.commons.collections4
org.apache.commons.collections4.bag
org.apache.commons.collections4.bidimap
org.apache.commons.collections4.collection
org.apache.commons.collections4.comparators
org.apache.commons.collections4.functors
org.apache.commons.collections4.iterators
org.apache.commons.collections4.keyvalue
org.apache.commons.collections4.list
org.apache.commons.collections4.map
org.apache.commons.collections4.multimap
org.apache.commons.collections4.multiset
org.apache.commons.collections4.properties
org.apache.commons.collections4.queue
org.apache.commons.collections4.sequence
org.apache.commons.collections4.set
org.apache.commons.collections4.splitmap
org.apache.commons.collections4.trie
org.apache.commons.collections4.trie.analyzer

Biblioteka, która doskonale uzupełnia środowisko Java SE Collections Framework.

CollectionUtils to klasa do wygodnej pracy z kolekcjami:

    filter/find(Collection, Predicate) - filtrowanie i wyszukiwanie według predykatu forAllDo(Collection, Closure) - wykonuje Closure dla każdego elementu, ale ta metoda jest przestarzała , użyj Iterator.forEach() is(Not)Empty(Collection) - pozwala aby nie sprawdzać wartości null przed wywołaniem isEqualCollection(Collection, Collection) - pomaga porównać dwie kolekcje

Istnieje również wiele innych klas o różnym poziomie użyteczności. Tutaj i poniżej wymieniam najczęściej stosowane wyłącznie w moim przypadku.

Apache Commons: IO

Packages
org.apache.commons.io
org.apache.commons.io.comparator
org.apache.commons.io.file
org.apache.commons.io.file.spi
org.apache.commons.io.filefilter
org.apache.commons.io.function
org.apache.commons.io.input
org.apache.commons.io.input.buffer
org.apache.commons.io.monitor
org.apache.commons.io.output
org.apache.commons.io.serialization

Dodatkowo ułatwia pracę z plikami w Javie:

FileUtils

  • copyDirectory(Plik, Plik) - kopiuje katalogi
  • copyFile(File, File) - skopiuj pliki
  • listFiles(File, String[], boolean) - wyświetla pliki według rozszerzenia i rekurencyjnie
  • readFileToString(Plik, Ciąg)
  • writeStringToFile(Plik, Ciąg)

IOUTtils

  • closeQuietly(Reader/Writer/InputStream/OutputStream) - zamyka strumień danych
  • copy(InputStream, OutputStream) - kopiowanie z jednego strumienia do drugiego