1. Знайомство з Apache Commons

Звісно, почнемо з історії!

Все почалося в 1999 році з реєстрації Apache Group від імені Apache Software Foundation (далі ASF). Проєктом, що підтримувався фондом, був Apache HTTP Web Server, створений між 1995 та 1999 роками.

Таким же став і проєкт Jakarta Project (проєкт Jakarta), який з'явився в результаті співпраці Sun Microsystems, IBM, Oracle та хлопців із Apache. І в 2001 в ході роботи команда розробників помітила, що вони часто пишуть однакову функціональність, іноді просто копіюють її один у одного. Такий код називається шаблонним. У них вдалося зібрати велику кількість коду, який допомагав розробникам, але не було бібліотеки для його зберігання.

Так з'явився проєкт Jakarta Commons, до якого додавали компоненти на Java (переважно на основі існуючого коду). Пізніше проєкт перейменували на Apache Commons.

Якщо говорити загально, то Apache Commons — це "велика колекція маленьких Java-утиліт". Вона використовується в багатьох проєктах із відкритим вихідним кодом.

Утиліти Apache Commons лежать в основі таких проєктів як Apache Tomcat, Struts, Hibernate тощо.

Звісно, все це можна підключити вручну, без системи складання (Maven, Gradle), але ми цього не робитимемо і просто додамо їх в наш проєкт.

Для роботи з Maven спочатку додаємо відповідну залежність:

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

Де ${apache.common.version} — версія цієї бібліотеки.

Для Gradle (Groovy):

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

2. Популярні бібліотеки Apache Commons

Ось список найбільш популярних класів та методів:

Apache Commons: Lang

У цій бібліотеці є такі пакети:


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

Тут можна зручно та швидко працювати з рядками, reflection, серіалізацією, об'єктами та системою. Зазначимо найбільш використовувані методи:

StringUtils

Безліч методів для маніпуляцій з рядками.

  • is(Not)Blank/Empty(String) — про перевірку такого типу: if (s!=null && s.trim().length()>0) час забути, і тут є хороша заміна.

StringEscapeUtils

  • (un)escapeSql(String) — заміна PreparedStatement
  • (un)escapeHtml(String) — для обробки значень з HTML

ToStringBuilder

  • reflectionToString(Object) — реалізація toString(), заснована на рефлексії. Під час видалення якогось поля за допомогою рефлексії результат методу зміниться.

EqualsBuilder & HashCodeBuilder

  • reflectionEquals/HashCode(Object) — хороша заміна автоматичної генерації зі своїм плюсом: ці два методи враховують структурні зміни об'єкта в процесі роботи, наприклад, додавання полів

ExceptionUtils

  • getFullStackTrace(Throwable) — виведення всього StackTrace у вигляді рядка

Apache Commons: Collections


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

Бібліотека, яка чудово доповнює Java SE Collections Framework.

CollectionUtils — клас для зручної роботи з колекціями:

    filter/find(Collection, Predicate) — фільтрація та пошук за предикатом forAllDo(Collection, Closure) — виконує Closure для кожного елемента, але цей метод deprecated: використовуй Iterator.forEach() is(Not)Empty(Collection) — дозволяє не перевіряти на null перед викликом isEqualCollection(Collection, Collection) — допомагає порівняти дві колекції

Є також багато інших класів різного рівня корисності. Тут і далі я перераховую найчастіше використовувані.

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

Додатково допомагає працювати з файлами в Java:

FileUtils

  • copyDirectory(File, File) — копіювання директорій
  • copyFile(File, File) — копіювання файлів
  • listFiles(File, String[], boolean) — список файлів за розширенням та рекурсивно
  • readFileToString(File, String)
  • writeStringToFile(File, String)

IOUtils

  • closeQuietly(Reader/Writer/InputStream/OutputStream) — закриває потік даних
  • copy(InputStream, OutputStream) — копіювання з одного потоку в інший