Apache Commons — проект фонда Apache Software Foundation (далее ASF), имеющий своей целью разработку и поддержку открытого программного обеспеченияповторного использования на языке Java, то есть библиотек Java. В более узком смысле Apache Commons — это «большая коллекция маленьких Java-утилит»[1]. Apache Commons ранее являлся частью проекта Jakarta Project и носил название «Jakarta Commons»[2]. Apache Commons содержит набор библиотек утилит Java самого разного назначения, доступных по лицензии Apache License, и использующихся во многих других проектах с открытым исходным кодом. Утилиты проекта Apache Commons лежат в основе таких проектов как Apache Tomcat, Struts, Hibernate и др.[3][4] По мнению Гейра Магнуссона Джуниора (англ.Geir Magnusson Jr), члена совета директоров ASF, бывшего техническим директором и лидером в таких компаниях как 10gen, Joost, Adeptra, Bloomberg и Intel, Apache Commons стал «местом, где программисты на языке Java в первую очередь ищут помощи, чтобы решить общие проблемы серверного и клиентского программирования»[5].
Согласно уставу проекта, проект должен «создавать и поддерживать пакеты, написанные на языке Java, предназначенные для использования в разработке серверных приложений, и спроектированные таким образом, чтобы их можно было использовать независимо в любом более крупном продукте или фреймворке. Каждый пакет будет поддерживаться таким же образом, как и сам продукт Jakarta» (англ."The subproject shall create and maintain packages written in the Java language, intended for use in server-related development, and designed to be used independently of any larger product or framework. Each package will be managed in the same manner as a larger Jakarta product.")[6].
История
История Apache Commons восходит к 1999 году, когда, в июне, была зарегистрирована ранее известная под названием «Apache Group» некоммерческая организация Apache Software Foundation (далее ASF)[7]. Основным проектом, поддерживаемым фондом, был Apache HTTPD Web Server, созданный между 1995 и 1999 гг. Одним из проектов Apache Software Foundation стал Jakarta Project (проект Jakarta), который являлся результатом сотрудничества компаний Sun Microsystems, IBM, Oracle и сообщества разработчиков веб-сервера (Apache HTTP Server). В начале 2001 года, в ходе работы в разных подпроектах проекта Jakarta, было замечено, что они часто реализовывают одну и ту же функциональность, а иногда копируют её друг у друга. Было накоплено множество полезного кода, который тем не менее было проблематично найти пользователям в виде простого отдельного пакета (библиотеки). После обсуждения данных проблем было решено создать проект Jakarta Commons[5], в котором начали активно создавать компоненты на Java, в основном на основе уже существующего кода. 19 марта 2001 Комитет проект-менеджмента Jakarta утвердил устав проекта[6], в котором оговаривались основные правила и условия работы в проекте[8]. Согласно уставу, первые пакеты были основаны на существующей кодовой базе ASF, включая код работающий с источниками данных и пулами баз данных, с конфигурирациями XML, ресурсами сообщений, интернационализацией, JNDI и именованием, тестовыми наборами. Первым пакетом, вошедшим в состав Commons, был пакет Database Connection Pool. В период 2001—2005 был разработан основной набор библиотек, ставший базисом для Apache Commons. К 2003 секция proper уже содержала 21 компонент[9], к 2004 — 28 компонентов[5], а к 2005 — 29 компонентов[10]. 19 мая 2004 была утверждена новая версия устава, с поправками в старый вариант[6]. В первом составе проекта Commons было 10 участников с правом внесения изменений, к 2004 году их было уже более 80[5]. 20 июня 2007 Apache Board (Совет Apache) по результатам анонимного голосования выделил проект Commons из состава проекта Jakarta, после чего Commons стал проектом верхнего уровня в иерархии Apache (то есть отдельным независимым проектом) и стал называться Apache Commons[11]. К концу 2012 года в proper уже было 43 активных компонента.
Структура
В иерархии проектов Apache Software Foundation Apache Commons является проектом «верхнего уровня». В свою очередь, Commons разбивается на множество проектов «второго уровня». Каждый проект второго уровня имеет свой сайт, каталог в общем репозиторииисходного кода, каталог в общей системе отслеживания ошибок и имеет своей целью разработку одного одноимённого компонента (библиотеки) Java. Активные проекты имеют несколько постоянных участников, неактивные проекты могут вообще не иметь постоянных участников. Компоненты представляют собой JAR файлы, как правило не превышающие по объёму 1 Мб[12]. Подпроекты Commons делятся на 3 секции: proper (корректные), sandbox (песочница) и dormant (спящие). Секция proper — основная секция проектов, которая на октябрь 2012 года включала 43 проекта. Компоненты секции proper поддерживаются в рабочем состоянии, и обновляются, сохраняя свои интерфейсы насколько возможно неизменными, чтобы не создавать проблемы существующим пользователям. Секция sandbox предназначена для создания новых проектов и подготовки их к включению в секцию proper или в другие проекты apache. В октябре 2012 года секция sandbox включала 16 проектов. Доступ для внесения изменений в проекты этой секции открыт для всех зарегистрированных участников Apache. В секцию Dormant переводят старые проекты, в которых была замечена слишком низкая активность по внесениям изменений, или полное отсутствие активности, и которые ASF не планирует в будущем обновлять (выпускать новые версии). К концу 2012 года туда было включено 15 проектов.
Компоненты
Пояснения к таблице:
proper — компоненты секции proper (корректные), «зрелые» компоненты, то есть активные и обновляемые, API которых стабилизирован;
sandbox — компоненты секции sandbox (песочница), «сырые» компоненты, то есть находящиеся в стадии разработки и тестирования;
dormant — компоненты секции dormant (спящие), то есть устаревшие и необновляемые, релизов по данным компонентам не планируется;
Первый релиз — дата первого официального релиза или первого стабильного релиза, как правило версии 1.0, библиотеки как отдельного компонента (альфа-релизы, dev-релизы, релиз-кандидаты, pre-релизы, релизы в составе других компонентов и релизы вне Apache/Jakarta Commons не учитываются)
Database connection pooling services. Создание пула соединений к базе данных, в котором каждое соединение может последовательно обслуживать множество клиентов.
Object-Graph Navigation Language. Язык навигации по графу объектов. Установка и получение свойств Java-объектов. Более мощная альтернатива для BeanUtils и EL/JSTL.
Virtual File System. Виртуальная файловая система, обращающаяся с обычными файлами, FTP, SMB, ZIP и т. п. как с единой логической файловой системой
benchmark
нет
dormant
нет
Тестирование производительности Java-кода (с возможностью включения/выключения во время исполнения). Не получил развития из-за существования достойных аналогов. Переведен в dormant в декабре 2005[77][78], пролежав в sandbox меньше года.
Кэширование объектов. API для хранения/извлечения объектов на основе ключа. Не получил развития, так как был вытеснен компонентами Stratum, JCS, EHCache и др., и кроме того зачастую может быть замещён классом LRUMap из Commons Collections[79]. Переведен в dormant в сентябре 2005[40][80].
Расширенный вариант java.lang.Class, который позволяет изменять определение класса во время исполнения. Предназначен для обработки Java-бинов в JDK при работе с классами List и Map и предоставляет альтернативу java.beans.Introspector. Переведен в dormant в сентябре 2005[40][81].
Codec-multipart
нет
dormant
нет
Полезен для веб-браузера, написанного на Java. Позволяет закодировать набор файлов и пары имя/значение в формате multipart/form-data (по протоколу, описанному в RFC2388 [47]). Переведен в dormant в сентябре 2005[40][82], пролежав в Sandbox полтора года.
Combo
нет
dormant
нет
Commons Combo, он же Commons Core. Проект, который так и не вышел за рамки обсуждения, начатого в августе 2003[83]. Предполагалось, что это будет сборка нескольких часто используемых компонентов Commons в один общий пакет JAR, или инструмент для создания такой сборки самим пользователем. В январе 2006 переведен в dormant[84][85].
Запуск и обработка событий. Декораторы над классами Java Collections Framework, которые также запускают события. Переведен в dormant в сентябре 2005[40][88].
Парсер лент типа RSS, Atom и т. п. Переведен в dormant из proper в январе 2006[89][90]
Filters
нет
dormant
нет
Сервлетные фильтры разного назначения для веб-приложений. Используют Servlet 2.3 API. Могут быть подключены в веб-приложения, как плагины. Переведен в dormant в сентябре 2005[40][91].
Grant
нет
dormant
нет
Небольшой набор хаков для Ant, чтобы лучше/иначе управлять путями и опциями. Переведен в dormant в сентябре 2005[92]
Http
нет
dormant
нет
Содержит простые утилиты для работы с протоколом HTTP (детектор браузера, парсер заголовка). Переведен в dormant в сентябре 2005[40][93].
Jex
нет
dormant
нет
Механизм плагинов для интерпретаторов языков выражений. Изначально включает два языка: JXPath и Bexl. Переведен в dormant в сентябре 2005[40][94].
Jakarta JAR Archive Repository. Попытка создать сервис наподобие CPAN [53] для Java-сообщества. Состоит из 2-х частей: распределённый репозиторий и набор инструментов для работы с репозиториями и управления пакетами. Переведен в dormant в сентябре 2005[40][95].
JPath
нет
dormant
нет
Механизм для использования языка XPath с графами обыкновенных объектов (JavaBeans, коллекции (контейнеры), массивы, объекты map и примитивные значения. Опирается на JAXP и реализацию интерпретатора XPath. Переведен в dormant в сентябре 2005[40][96].
Jrcs
нет
dormant
нет
Java RCS Tools. Парсинг и манипулирование файлами-архивами RCS наподобие Revision Control System и Concurrent Versions System. Зависит от пакета ORO. Пакетом занимался только один разработчик, который так и не смог создать для него сайт, привлечь новых участников, завершить разработку и выпустить релиз. В августе 2005 Jrcs официально перешёл в Codehaus [54], откуда он потом бесследно исчез, а кодовая база на сайте ASF переведена в Dormant[97].
Jux
нет
dormant
нет
Commons JUnit Extensions. Предназначен для создания тестов. Зависит от junit. Переведен в dormant в сентябре 2005[40][98].
Инструмент функционального тестирования HTTP, использующий XML для задания тестов. Для автоматизированного QA. Переведен в dormant в марте 2006[99][100]
Общий интерфейс (мост) над технологией маппирования Java-объектов, выбранной проектом. Поддерживает техники: JDBC, JDO, EJB, Hibernate, iBatis, XML. Переведен в dormant в сентябре 2005[40][101]
Тулкит для построения веб-приложений. Переведен в dormant в сентябре 2005[40][107]
Services
нет
dormant
нет
Service Manager. Универсальный мост, соединяющий центральное приложение (например, Jakarta Struts) с внешними модулями. Переведен в dormant в сентябре 2005[40][108]
Servlet
нет
dormant
нет
Утилиты для разработки сервлетов. Переведен в dormant в декабре 2005[77][109]
Simplestore
нет
dormant
нет
Интерфейс для хранения и извлечения объектов. Переведен в dormant в сентябре 2005[40][110]
Tbm
нет
dormant
нет
Thread Benchmark. Фреймворк для тестирования многопоточных приложений. Поиск узких мест многопоточности (threading bottlenecks) и синхронизации (synchronization bottlenecks). Переведен в dormant в сентябре 2005[40][111]
Test
нет
dormant
нет
Утилиты для тестирования. Переведен в dormant в сентябре 2005[40][112]
Threading
нет
dormant
нет
Утилитные классы и интерфейсы для координации и коммуникации потоков между собой в многопоточных серверных приложениях. Переведен в dormant в сентябре 2005[40][113]
Фреймворк для работы с пулами потоков и асинхронного выполнения задач. Вытеснен библиотекой Доуга Леа util.concurrent, предшественником пакета java.util.concurrent, входящего в состав JDK. Переведен в dormant в сентябре 2005[40][114]
Утилитные классы для транзакционного программирования на Java (многоуровневые блокировщики, коллекции, транзакционный доступ к файлам). В марте 2010 основной разработчик отказался от продолжения работы над проектом, обосновав это тем, что, по его мнению, невозможно построить транзакционную файловую систему поверх обычной[116]. Переведен в dormant в апреле 2010[117] Transaction — это первый компонент Commons, который был переведен в dormant из секции proper, то есть компонент, имеющий релизы. До него в dormant переводились только компоненты из sandbox[118].
Компонент для связи компонентов и модулей Java-приложения при помощи скриптов (концепция «Композиция» приложения). Переведен в dormant в сентябре 2005[40][119]
Согласно утверждению Гийома Руссо (директор компании Antelink, поддерживающей Antepedia, крупнейший онлайн-справочник и поисковик компонентов с открытым исходным кодом), 3 % программного обеспечения с открытым исходным кодом используют библиотеки Apache Commons[123]. В пятёрку самых популярных компонентов входят компоненты Logging, Collections, Lang, BeanUtils, Httpclient.
По статистике сайта AppBrain.com (онлайн-библиотека приложений Android), компоненты Apache Commons Codec и IO используются более чем в 1 % приложений на платформе Android, а Logging и Lang использует более 0,5 % приложений Android[124].
Библиотека Apache Commons Math была выбрана в 2011 году французским космическим агентством CNES (Centre National d'Études Spatiales) в качестве базиса для разработки динамичных систем космических полётов, известных как проект Сириус (Sirius)[125].
↑Plotnikov, Dmitri (25 июня 2002). [ANNOUNCEMENT] JXPath 1.0 Released. The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 6 октября 2012.
↑Yandell, Henri (4 октября 2002). [ANN] Commons Lang 1.0 Released!. The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 6 октября 2012.
↑Brekke, Jeffrey D. (23 февраля 2003). [ANNOUNCE] Commons Net 1.0.0 Released. The Jakarta Announcement List (Mailing list) (англ.). Дата обращения: 8 октября 2012.
↑Pemberton, Niall (16 апреля 2010). Re: Future of Transaction subproject. Commons Developer List (Mailing list) (англ.). Дата обращения: 26 октября 2013.
Goyal, Vikram. Using the Jakarta Commons. 2003. Part 1, Part 2, Part 3. — серия статей об использовании Jakarta Commons (ныне Apache Commons)
Narayanan A.R. Extend the JDK Classes with Jakarta Commons. 2005. Part 1, Part 2, Part 3 — серия статей об использовании Jakarta Commons (ныне Apache Commons)