Въведение в Apache Commons

Разбира се, нека започнем с историята!

Всичко започва през 1999 г. с регистрацията на "Apache Group" от името на Apache Software Foundation (ASF). Проектът, подкрепен от фондацията, беше уеб сървърът Apache HTTPD, създаден между 1995 и 1999 г.

Същото беше проектът Джакарта (проект Джакарта), който се появи в резултат на сътрудничеството на Sun Microsystems, IBM, Oracle и момчетата от Apache. И през 2001 г., по време на работа, екипът за разработка забеляза, че често пишат една и съща функционалност, понякога просто я копират един от друг. Такъв code се нарича шаблонен. Те успяха да съберат голямо количество code, който помогна на разработчиците, но нямаше библиотека, която да го съхранява.

Така се ражда проектът Jakarta Commons, в който са добавени Java компоненти (предимно въз основа на съществуващ code). По-късно проектът е преименуван на Apache Commons.

По-общо казано, Apache Commons е „голяма колекция от малки Java помощни програми“. Използва се в много проекти с отворен code.

Помощните програми на 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} е 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

Тук можете удобно и бързо да работите с низове, отражение, сериализация, обекти и системата. Нека отбележим най-използваните методи:

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: Колекции

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) - извършва затваряне за всеки елемент, но този метод е остарял , използвайте 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(Файл, Файл) - копиране на директории
  • copyFile(File, File) - копиране на файлове
  • listFiles(File, String[], boolean) - списък на файловете по разширение и рекурсивно
  • readFileToString(файл, низ)
  • writeStringToFile(файл, низ)

IOUtils

  • closeQuietly(Reader/Writer/InputStream/OutputStream) - затваря потока от данни
  • copy(InputStream, OutputStream) - копиране от един поток в друг