Знакомство с 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) — копирование из одного потока в другой