Знакомство с Apache Commons

Конечно, начнем с истории!

Все началось в 1999 году с регистрации “Apache Group” от имени Apache Software Foundation (далее ASF). Проектом, который поддерживался фондом, был Apache HTTPD 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'

Популярные библиотеки 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) — замена PreparedStatment
  • (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) — копирование из одного потока в другой