Часть 4. основы maven

Деревья зависимостей

Одна из наиболее полезных функций Maven ― поддержка управления зависимостями: вы просто определяете библиотеки, от которых зависит ваше приложение, а Maven находит их (в локальном или центральном хранилище), загружает и использует для компиляции кода.


В некоторых случаях может потребоваться знание происхождения определенной зависимости — например, если в сборке оказались разные и несовместимые версии одного и того же JAR-файла. В этом случае нужно предотвратить включение в сборку одной версии JAR-файла, но сначала найти зависимости, удерживающие JAR.

Поиск зависимостей оказывается на удивление простым делом, если знать следующую команду:

mvn dependency:tree

Аргумент отображает все прямые зависимости, а затем показывает все подзависимости (а также их подзависимости и т.д.). Например, в листинге 5 приведен отрывок из клиентской библиотеки, требуемой одной из моих зависимостей.

Листинг 5. Дерево зависимостей Maven
 ------------------------------------------------------------------------
 Building Client library for communicating with the LDE
    task-segment: 
 ------------------------------------------------------------------------
 
 com.lmt.pos:sis-client:jar:2.1.14
 +- org.codehaus.woodstox:woodstox-core-lgpl:jar:4.0.7:compile
 |  \- org.codehaus.woodstox:stax2-api:jar:3.0.1:compile
 +- org.easymock:easymockclassextension:jar:2.5.2:test
 |  +- cglib:cglib-nodep:jar:2.2:test
 |  \- org.objenesis:objenesis:jar:1.2:test

Из видно, что проекту требуются библиотеки и . Библиотеке , в свою очередь, требуются библиотеки и . В случае возникновения проблем с , таких как наличие двух версий, 1.2 и 1.3, это дерево зависимостей показало бы, что артефакт 1.2 импортирован косвенным путем библиотекой .

Аргумент сэкономил мне много часов диагностики ошибочной сборки; надеюсь, что и для вас он сделает то же самое.

Заголовок


Внутри тэга project содержится основная и обязательная информация о проекте:

Пример 3. Заголовок

В Maven каждый проект идентифицируется парой groupId, artifactId.

Во избежание конфликта имён, groupId — наименование организации или подразделения и обычно действуют такие же правила как и при именовании пакетов в Java — записывают доменное имя организации или сайта проекта.

artifactId — название проекта.

Внутри тэга version хранится версия проекта.

Тройкой groupId, artifactId, version (далее — GAV) можно однозначно идентифицировать jar файл приложения или библиотеки. Если состояние кода для проекта не зафиксировано, то в конце к имени версии добавляется «-SNAPSHOT» что обозначает, что версия в разработке и результирующий jar файл может меняться.

Основные сведения

Мавен изначально создавался , принимая во внимание портируемость. Но довольно часто приложение приходится запускать в разном окружении: например, для разработки используется одна база данных, в рабочем сервере используется другая. при этом могут понадобиться разные настройки, разные зависимости и плагины. Для этих целей в maven используются профайлы.

Давайте определим два профайла: один для разработки, другой для производственного сервера. Для разработки вполне подойдёт база hsqldb, которая хранит все данные в памяти. На производственном сервере же используется база данных postgres, которая сохраняет все данные на диск. В профайлах для каждой конфигурации определены свои проперти database.url и зависимости для разных jdbc драйверов.

Ниже приведён пример объявления таких профайлов.

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <profiles>
(1)     <profile>
            <id>development</id>
            <properties>
                <database.url>jdbc:hsqldb:mem:testdb</database.url>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.hsqldb</groupId>
                    <artifactId>hsqldb</artifactId>
                    <version>2.0.0</version>
                </dependency>
            </dependencies>
        </profile>
(2)     <profile>
            <id>productionServer</id>
            <properties>
                <database.url>jdbc:postgresql://databseserver/database</database.url>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                    <version>9.0-801.jdbc4</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
    .....
</project>
               

цифрами 1 и 2 обозначены начала объявления профайлов. каждый профайл имеет идентификатор в данном случае development и productionServer.

Внутри тэга <profile> содержатся все те же объявления что и внутри <project>: properties, dependencies, и др. Вот полный список тегов которые могут содержаться внутри профайлов:

Объявление зависимостей

Простой «Hello World» пример полностью автономный и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений зависит от внешних библиотек, с реализацией распостраненного и/или сложного функционала.

К примеру, предположим, что в дополнение к «Hello World!» вы хотите, чтобы приложение печатало текущую дату и время. Вы могли бы использовать функциональность из стандартных(native) Java библиотек, но мы можем сделать это и другими интересными способами, например с помощью Joda Time библиотеки.


Для начала, изменим , как показано ниже:

Здесь использует Joda Time класс для получения и печати текущего времени.

Если бы вы запустили для сборки проекта сейчас, то получили бы ошибку сборки, потому что вы не объявили Joda Time компилируемую зависимость в сборке. Вы можете это исправить, добавив следующие строки в pom.xml(в пределах элемента):

Этот блок XML объявляет список зависимостей проекта. В частности, он объявляет единственную зависимость от Joda Time библиотеки. В элементе, зависимость определяется через описание трех вложенных элементов:

  • — группа или организация, к которой принадлежит зависимость.
  • — необходимая библиотека
  • — версия необходимой библиотеки

По умолчанию, все зависимости определены как зависимости. Т.е. они должны быть доступны во время компиляции(а если вы собираете WAR-файл, то в /WEB-INF/lib каталоге). Кроме того, вы можете добавить элемент, с одним из значений:

  • — зависимости, которые требуются для компиляции кода проекта, но которые будут доступны во время выполнения кода контейнером(например, Java Servlet API)
  • — зависимости, которые используются для компиляции и запуска тестов, но не требуемые для сборки или выполнения кода проекта

Сейчас, если вы выполните или , Maven должен будет разрешить Joda Time зависимость из Maven Central репозитория и успешно собрать проект.

Здесь полная версия :

Developers

Name Email Dev Id Roles Organization
Olivier Lamy olamy<at>apache.org olamy PMC Chair
Arnaud Héritier aheritier<at>apache.org aheritier PMC Member
Barrie Treloar baerrach<at>apache.org baerrach PMC Member
Benson Margulies bimargulies<at>apache.org bimargulies PMC Member
Brett Porter brett<at>apache.org brett PMC Member ASF
Brian Fox brianf<at>apache.org brianf PMC Member Sonatype
Carlos Sanchez carlos<at>apache.org carlos PMC Member ASF
Dennis Lundberg dennisl<at>apache.org dennisl PMC Member ASF
Daniel Fabulich dfabulich<at>apache.org dfabulich PMC Member
Daniel Kulp dkulp<at>apache.org dkulp PMC Member ASF
Emmanuel Venisse evenisse<at>apache.org evenisse PMC Member ASF
Hervé Boutemy hboutemy<at>apache.org hboutemy PMC Member ASF
John Casey jdcasey<at>apache.org jdcasey PMC Member ASF
Kristian Rosenvold krosenvold<at>apache.org krosenvold PMC Member
Mark Hobson markh<at>apache.org markh PMC Member
Milos Kleint mkleint PMC Member
Maria Odea B. Ching oching PMC Member
Paul Gier pgier<at>apache.org pgier PMC Member Red Hat
Robert Scholte rfscholte<at>apache.org rfscholte PMC Member
Ralph Goers rgoers<at>apache.org rgoers PMC Member Intuit
Stephane Nicoll snicoll<at>apache.org snicoll PMC Member ASF
Stephen Connolly stephenc<at>apache.org stephenc PMC Member
Mark Struberg struberg<at>apache.org struberg PMC Member
Vincent Siveton vsiveton<at>apache.org vsiveton PMC Member ASF
Wayne Fay wfay<at>apache.org wfay PMC Member ASF
Anders Hammar andham<at>apache.org andham Committer
Brian Demers bdemers<at>apache.org bdemers Committer Sonatype
Fabrice Bellingard bellingard Committer
Benjamin Bentmann bentmann<at>apache.org bentmann Committer Sonatype
Tamas Cservenak cstamas<at>apache.org cstamas Committer Sonatype
Dan Tran dantran Committer
Damian Bradicich dbradicich<at>apache.org dbradicich Committer Sonatype
Fabrizio Giustina fgiust<at>apache.org fgiust Committer openmind
Evgeny Mandrikov godin<at>apache.org godin Committer SonarSource
Andrew Williams handyande<at>apache.org handyande Committer
Igor Fedorenko igor<at>ifedorenko.com ifedorenko Committer Sonatype
Jeff Jensen jjensen Committer
Jason van Zyl jvanzyl Committer
Lukas Theussl ltheussl<at>apache.org ltheussl Committer
Mauro Talevi mauro Committer
Nicolas de Loof nicolas Committer
Raphaël Piéroni rafale<at>apache.org rafale Committer Dexem
Simone Tripodi simonetripodi<at>apache.org simonetripodi Committer
Tony Chemit tchemit<at>apache.org tchemit Committer CodeLutin
Vincent Massol vmassol<at>apache.org vmassol Committer ASF
Allan Q. Ramirez aramirez Emeritus
Henri Yandell bayard Emeritus
Chris Stevenson chrisjs Emeritus
David Blevins dblevins Emeritus
Daniel Rall dlr Emeritus
Edwin Punzalan epunzalan<at>apache.org epunzalan Emeritus
Felipe Leme felipeal Emeritus
Jesse McConnell jmcconnell<at>apache.org jmcconnell Emeritus ASF
Joakim Erdfelt joakime<at>apache.org joakime Emeritus ASF
James Strachan jstrachan Emeritus
Ernesto Tolentino Jr. jtolentino<at>apache.org jtolentino Emeritus ASF
Mike Perham mperham<at>gmail.com mperham Emeritus IBM
Oleg Gusakov ogusakov Emeritus
Patrick Schneider pschneider<at>gmail.com pschneider Emeritus
Petar Tahchiev ptahchiev<at>apache.org ptahchiev Emeritus
Rahul Thakur rinku Emeritus
Shinobu Kuwai shinobu Emeritus
Torbjorn Eikli Smorgrav smorgrav Emeritus
Trygve Laugstol trygvis<at>apache.org trygvis Emeritus ASF
Wendy Smoak wsmoak<at>apache.org wsmoak Emeritus
Johnny Ruiz III jruiz<at>apache.org jruiz Emeritus
Kenney Westerhof kenney<at>apache.org kenney Emeritus Neonics

Project Plugin Management

GroupId ArtifactId Version
org.apache.maven.plugins maven-antrun-plugin 1.8
org.apache.maven.plugins maven-assembly-plugin 3.1.1
org.apache.maven.plugins maven-changes-plugin 2.12.1
org.apache.maven.plugins maven-checkstyle-plugin 3.0.0
org.apache.maven.plugins maven-clean-plugin 3.1.0
org.apache.maven.plugins maven-compiler-plugin 3.7.0
org.apache.maven.plugins maven-dependency-plugin 3.1.1
org.apache.maven.plugins maven-deploy-plugin 2.8.2
org.apache.maven.plugins maven-docck-plugin 1.1
org.apache.maven.plugins maven-ear-plugin 3.0.1
org.apache.maven.plugins maven-enforcer-plugin 1.4.1
org.apache.maven.plugins maven-failsafe-plugin 2.22.0
org.apache.maven.plugins maven-gpg-plugin 1.6
org.apache.maven.plugins maven-help-plugin 3.1.0
org.apache.maven.plugins maven-install-plugin 2.5.2
org.apache.maven.plugins maven-invoker-plugin 3.1.0
org.apache.maven.plugins maven-jar-plugin 3.1.0
org.apache.maven.plugins maven-javadoc-plugin 3.0.1
org.apache.maven.plugins maven-jxr-plugin 2.5
org.apache.maven.plugins maven-plugin-plugin 3.5.2
org.apache.maven.plugins maven-pmd-plugin 3.8
org.apache.maven.plugins maven-project-info-reports-plugin 3.0.0
org.apache.maven.plugins maven-release-plugin 2.5.3
org.apache.maven.plugins maven-remote-resources-plugin 1.5
org.apache.maven.plugins maven-resources-plugin 3.1.0
org.apache.maven.plugins maven-scm-plugin 1.9.5
org.apache.maven.plugins maven-scm-publish-plugin 3.0.0
org.apache.maven.plugins maven-shade-plugin 3.1.1
org.apache.maven.plugins maven-site-plugin 3.7.1
org.apache.maven.plugins maven-source-plugin 3.0.1
org.apache.maven.plugins maven-surefire-plugin 2.22.0
org.apache.maven.plugins maven-surefire-report-plugin 2.22.0
org.apache.maven.plugins maven-toolchains-plugin 1.1
org.apache.maven.plugins maven-war-plugin 3.2.2
org.apache.rat apache-rat-plugin 0.12
org.codehaus.modello modello-maven-plugin 1.11
org.codehaus.mojo buildnumber-maven-plugin 1.4
org.codehaus.mojo clirr-maven-plugin 2.8
org.codehaus.mojo findbugs-maven-plugin 3.0.5
org.codehaus.mojo taglist-maven-plugin 2.4
org.codehaus.plexus plexus-component-metadata 2.0.0
org.eclipse.m2e lifecycle-mapping 1.0.0
org.eclipse.sisu sisu-maven-plugin 0.3.3

Использование профилей

Наиболее значительные проекты содержат, по крайней мере, базовую группу инструментальных сред, решающих задачи, связанные с разработкой, контролем качества (QA), интеграцией и производством. Задача управления всеми этими средами заключается в настройке сборки, которая должна подключаться к нужной базе данных, выполнять нужный набор сценариев и развертывать в каждой среде все необходимые артефакты. С помощью профилей Maven можно делать все это без необходимости составлять четкие инструкции для каждой среды индивидуально.

Ключом служит объединение профилей всех систем с проблемно-ориентированными профилями. Каждый профиль системы определяет конкретные места, сценарии и серверы. Так, в своем файле pom.xml я определяю проблемно-ориентированный профиль , как показано в листинге 6.

Листинг 6. Профиль развертывания
    <profiles>
        <profile>
            <id>deploywar</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>net.fpic</groupId>
                        <artifactId>tomcat-deployer-plugin</artifactId>
                        <version>1.0-SNAPSHOT</version>
                        <executions>
                            <execution>
                                <id>pos</id>
                                <phase>install</phase>
                                <goals>
                                    <goal>deploy</goal>
                                </goals>
                                <configuration>
                                    <host>${deploymentManagerRestHost}</host>
                                    <port>${deploymentManagerRestPort}</port>
                                    <username>${deploymentManagerRestUsername}</username>
                                    <password>${deploymentManagerRestPassword}</password>
                                    <artifactSource>
                                      address/target/addressservice.war
                                    </artifactSource>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

Этот профиль, определяемый идентификатором , выполняет плагин , настроенный на подключение к определенному узлу, порту и к определенным учетным данным (имя пользователя/пароль). Вся эта информация задается с помощью переменных, таких как . Эти переменные определены в моем файле profiles.xml для каждой инструментальной среды, как показано в листинге 7.

Листинг 7. profiles.XML
        <!-- Defines the development deployment information -->
        <profile>
            <id>dev</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>dev</value>
                </property>
            </activation>
            <properties>
                <deploymentManagerRestHost>10.50.50.52</deploymentManagerRestHost>
                <deploymentManagerRestPort>58090</deploymentManagerRestPort>
                <deploymentManagerRestUsername>myusername</deploymentManagerRestUsername>
                <deploymentManagerRestPassword>mypassword</deploymentManagerRestPassword>
            </properties>
        </profile>

        <!-- Defines the QA deployment information -->
        <profile>
            <id>qa</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>qa</value>
                </property>
            </activation>
            <properties>
                <deploymentManagerRestHost>10.50.50.50</deploymentManagerRestHost>
                <deploymentManagerRestPort>58090</deploymentManagerRestPort>
                <deploymentManagerRestUsername>
                  myotherusername
                </deploymentManagerRestUsername>
                <deploymentManagerRestPassword>
                  myotherpassword
                </deploymentManagerRestPassword>
            </properties>
        </profile>

Развертывание профилей Maven


В файле profiles.xml в я определил два профиля и активизировал их на основе значения свойства (среды) . Если свойству присвоить значение , то будет использоваться информация для развертывания среды разработки. Если свойству присвоить значение , то будет использоваться информация для развертывания среды QA, и т.д.

Вот команда для развертывания файла:

mvn -Pdeploywar -Denv=dev clean install

Флаг предписывает Maven явно включить профиль . Оператор создает системное свойство с именем и присваивает ему значение , которое активирует конфигурацию среды разработки. Передача активировала бы конфигурацию среды QA.

История разработки

Maven был создан канадцем Джейсоном ван Зилом (Jason van Zyl) и организованной им фирмой Sonatype. Он начался как подпроект Apache Turbine в 2002 г. В 2003 году Maven был квалифицирован как Apache-проект верхнего уровня, тогда же появилась его первая версия — Maven 1.x. Она была опубликована 13 июля 2004 как версия 1.0. Это происходило, однако, так быстро, что некоторые частности оказались непродуманными. Например, слишком много конфигурации, проблемы с производительностью.

Поэтому концепция была доработана и с 2005 года началась параллельная разработка Maven 2.x, которая была сдана в версии 2.0 19 октября 2005 года.

Maven 1.x не разрабатывается дальше и ограничивается поддержкой пользователей и устранением ошибок.

Разработка Maven 3.0 началась в 2008 г.. После восьми альфа-релизов, первая бета-версия Maven 3.0 была опубликована в октябре 2010 г

Особенное внимание было уделено её обратной совместимости с Maven 2. Для большинства проектов переход от версии Maven 2 к версии Maven 3 не требует никаких изменений.

Разработка Maven происходит в следующих подпроектах:

  • Maven 1.x и Maven 2.x — старые версии Maven-а.
  • Maven 3.x развивает текущую линию продуктов Maven.
  • Plugins разрабатывает большинство Maven-плагинов.
  • Shared Components изготовляет компоненты программного обеспечения, которые могут использоваться всеми другими подпроектами.
  • Ant Tasks позволяет использовать возможности Ant из Maven.
  • Doxia — это фреймворк для генерации контента из форматов Almost Plain Text (APT), Confluence, DocBook, FML (FAQ Markup Language), LaTeX, Rich Text Format (RTF), TWiki, XDoc и XHTML.
  • SCM (Source Code Management) разрабатывает программное обеспечение для подключения Apache к различным системам версионирования как CVS или Subversion.
  • Surefire разрабатывает тест-фреймворк для Maven-а.
  • Wagon готовит абстракцию коммуникационных протоколов как «доступ к файлам», HTTP или FTP.

Developers

Name Email Dev Id Roles Organization
Olivier Lamy olamy<at>apache.org olamy PMC Chair
Arnaud Héritier aheritier<at>apache.org aheritier PMC Member
Barrie Treloar baerrach<at>apache.org baerrach PMC Member
Benson Margulies bimargulies<at>apache.org bimargulies PMC Member
Brett Porter brett<at>apache.org brett PMC Member ASF
Brian Fox brianf<at>apache.org brianf PMC Member Sonatype
Carlos Sanchez carlos<at>apache.org carlos PMC Member ASF
Dennis Lundberg dennisl<at>apache.org dennisl PMC Member ASF
Daniel Fabulich dfabulich<at>apache.org dfabulich PMC Member
Daniel Kulp dkulp<at>apache.org dkulp PMC Member ASF
Emmanuel Venisse evenisse<at>apache.org evenisse PMC Member ASF
Hervé Boutemy hboutemy<at>apache.org hboutemy PMC Member ASF
John Casey jdcasey<at>apache.org jdcasey PMC Member ASF
Kristian Rosenvold krosenvold<at>apache.org krosenvold PMC Member
Mark Hobson markh<at>apache.org markh PMC Member
Milos Kleint mkleint PMC Member
Maria Odea B. Ching oching PMC Member
Paul Gier pgier<at>apache.org pgier PMC Member Red Hat
Robert Scholte rfscholte<at>apache.org rfscholte PMC Member
Ralph Goers rgoers<at>apache.org rgoers PMC Member Intuit
Stephane Nicoll snicoll<at>apache.org snicoll PMC Member ASF
Stephen Connolly stephenc<at>apache.org stephenc PMC Member
Mark Struberg struberg<at>apache.org struberg PMC Member
Vincent Siveton vsiveton<at>apache.org vsiveton PMC Member ASF
Wayne Fay wfay<at>apache.org wfay PMC Member ASF
Anders Hammar andham<at>apache.org andham Committer
Brian Demers bdemers<at>apache.org bdemers Committer Sonatype
Fabrice Bellingard bellingard Committer
Benjamin Bentmann bentmann<at>apache.org bentmann Committer Sonatype
Tamas Cservenak cstamas<at>apache.org cstamas Committer Sonatype
Dan Tran dantran Committer
Damian Bradicich dbradicich<at>apache.org dbradicich Committer Sonatype
Fabrizio Giustina fgiust<at>apache.org fgiust Committer openmind
Evgeny Mandrikov godin<at>apache.org godin Committer SonarSource
Andrew Williams handyande<at>apache.org handyande Committer
Igor Fedorenko igor<at>ifedorenko.com ifedorenko Committer Sonatype
Jeff Jensen jjensen Committer
Jason van Zyl jvanzyl Committer
Lukas Theussl ltheussl<at>apache.org ltheussl Committer
Mauro Talevi mauro Committer
Nicolas de Loof nicolas Committer
Raphaël Piéroni rafale<at>apache.org rafale Committer Dexem
Simone Tripodi simonetripodi<at>apache.org simonetripodi Committer
Tony Chemit tchemit<at>apache.org tchemit Committer CodeLutin
Vincent Massol vmassol<at>apache.org vmassol Committer ASF
Allan Q. Ramirez aramirez Emeritus
Henri Yandell bayard Emeritus
Chris Stevenson chrisjs Emeritus
David Blevins dblevins Emeritus
Daniel Rall dlr Emeritus
Edwin Punzalan epunzalan<at>apache.org epunzalan Emeritus
Felipe Leme felipeal Emeritus
Jesse McConnell jmcconnell<at>apache.org jmcconnell Emeritus ASF
Joakim Erdfelt joakime<at>apache.org joakime Emeritus ASF
James Strachan jstrachan Emeritus
Ernesto Tolentino Jr. jtolentino<at>apache.org jtolentino Emeritus ASF
Mike Perham mperham<at>gmail.com mperham Emeritus IBM
Oleg Gusakov ogusakov Emeritus
Patrick Schneider pschneider<at>gmail.com pschneider Emeritus
Petar Tahchiev ptahchiev<at>apache.org ptahchiev Emeritus
Rahul Thakur rinku Emeritus
Shinobu Kuwai shinobu Emeritus
Torbjorn Eikli Smorgrav smorgrav Emeritus
Trygve Laugstol trygvis<at>apache.org trygvis Emeritus ASF
Wendy Smoak wsmoak<at>apache.org wsmoak Emeritus
Johnny Ruiz III jruiz<at>apache.org jruiz Emeritus
Kenney Westerhof kenney<at>apache.org kenney Emeritus Neonics

Developers

Name Email Dev Id Roles Organization
Robert Scholte rfscholte<at>apache.org rfscholte PMC Chair
Arnaud Héritier aheritier<at>apache.org aheritier PMC Member
Anders Hammar andham<at>apache.org andham PMC Member
Barrie Treloar baerrach<at>apache.org baerrach PMC Member
Benson Margulies bimargulies<at>apache.org bimargulies PMC Member
Brian Fox brianf<at>apache.org brianf PMC Member Sonatype
Tamas Cservenak cstamas<at>apache.org cstamas PMC Member
Dennis Lundberg dennisl<at>apache.org dennisl PMC Member ASF
Daniel Kulp dkulp<at>apache.org dkulp PMC Member ASF
Emmanuel Venisse evenisse<at>apache.org evenisse PMC Member ASF
Guillaume Boué gboue<at>apache.org gboue PMC Member
Hervé Boutemy hboutemy<at>apache.org hboutemy PMC Member ASF
Igor Fedorenko igor<at>ifedorenko.com ifedorenko PMC Member Sonatype
Jason van Zyl jason<at>maven.org jvanzyl PMC Member
Karl Heinz Marbaise khmarbaise<at>apache.org khmarbaise PMC Member
Kristian Rosenvold krosenvold<at>apache.org krosenvold PMC Member
Milos Kleint mkleint PMC Member
Olivier Lamy olamy<at>apache.org olamy PMC Member
Michael Osipov michaelo<at>apache.org michaelo PMC Member
Ralph Goers rgoers<at>apache.org rgoers PMC Member Intuit
Stephen Connolly stephenc<at>apache.org stephenc PMC Member
Mark Struberg struberg<at>apache.org struberg PMC Member
Tibor Digaňa tibordigana<at>apache.org tibordigana PMC Member
Vincent Siveton vsiveton<at>apache.org vsiveton PMC Member ASF
Wayne Fay wfay<at>apache.org wfay PMC Member ASF
Andreas Dangel adangel<at>apache.org adangel Committer
Brian Demers bdemers<at>apache.org bdemers Committer Sonatype
Fabrice Bellingard bellingard Committer
Benjamin Bentmann bentmann<at>apache.org bentmann Committer Sonatype
Chris Graham chrisgwarp<at>apache.org chrisgwarp Committer
Dan Tran dantran<at>apache.org dantran Committer
Damian Bradicich dbradicich<at>apache.org dbradicich Committer Sonatype
Brett Porter brett<at>apache.org brett Committer ASF
Daniel Fabulich dfabulich<at>apache.org dfabulich Committer
Enrico Olivelli eolivelli<at>apache.org eolivelli Committer Diennea
Fabrizio Giustina fgiust<at>apache.org fgiust Committer openmind
Evgeny Mandrikov godin<at>apache.org godin Committer SonarSource
Andrew Williams handyande<at>apache.org handyande Committer
Dominik Bartholdi imod<at>apache.org imod Committer
Jeff Jensen jjensen Committer
Lukas Theussl ltheussl<at>apache.org ltheussl Committer
Mark Hobson markh<at>apache.org markh Committer
Mauro Talevi mauro Committer
Mirko Friedenhagen mfriedenhagen<at>apache.org mfriedenhagen Committer
Manfred Moser mmoser<at>apache.org mmoser Committer
Nicolas de Loof nicolas Committer
Maria Odea B. Ching oching Committer
Paul Gier pgier<at>apache.org pgier Committer Red Hat
Petar Tahchiev ptahchiev<at>apache.org ptahchiev Committer
Raphaël Piéroni rafale<at>apache.org rafale Committer Dexem
Christian Schulte schulte<at>apache.org schulte Committer
Stephane Nicoll snicoll<at>apache.org snicoll Committer
Simone Tripodi simonetripodi<at>apache.org simonetripodi Committer
Christian Stein sor<at>apache.org sor Committer
Tony Chemit tchemit<at>apache.org tchemit Committer CodeLutin
Vincent Massol vmassol<at>apache.org vmassol Committer ASF
Sylwester Lachiewicz slachiewicz<at>apache.org slachiewicz Committer
Elliotte Rusty Harold elharo<at>apache.org elharo Committer
Andreas Gudian agudian<at>apache.org agudian Emeritus
Allan Q. Ramirez aramirez Emeritus
Henri Yandell bayard Emeritus
Carlos Sanchez carlos<at>apache.org carlos Emeritus ASF
Chris Stevenson chrisjs Emeritus
David Blevins dblevins Emeritus
Daniel Rall dlr Emeritus
Edwin Punzalan epunzalan<at>apache.org epunzalan Emeritus
Felipe Leme felipeal Emeritus
John Casey jdcasey<at>apache.org jdcasey Emeritus ASF
Jesse McConnell jmcconnell<at>apache.org jmcconnell Emeritus ASF
Joakim Erdfelt joakime<at>apache.org joakime Emeritus ASF
Johnny Ruiz III jruiz<at>apache.org jruiz Emeritus
James Strachan jstrachan Emeritus
Ernesto Tolentino Jr. jtolentino<at>apache.org jtolentino Emeritus ASF
Kenney Westerhof kenney<at>apache.org kenney Emeritus Neonics
Mike Perham mperham<at>gmail.com mperham Emeritus IBM
Oleg Gusakov ogusakov Emeritus
Patrick Schneider pschneider<at>gmail.com pschneider Emeritus
Rahul Thakur rinku Emeritus
Shinobu Kuwai shinobu Emeritus
Torbjorn Eikli Smorgrav smorgrav Emeritus
Trygve Laugstol trygvis<at>apache.org trygvis Emeritus ASF
Wendy Smoak wsmoak<at>apache.org wsmoak Emeritus

С этим читают