Maven 3:уличная магияАлексей СолнцевJEEConf 2011
Обо мнеJava и Flex aрхитектор в компанииInfopulse Ukraine
Certified Scrum Practitioner
Координатор перевода книг "Scrum and XP from the Trenches“ и“Kanban and Scrum – making the most of both”
Agile тренер в XP InjectionМой опыт работы с MavenЗавершился перевод проекта с Ant  на MavenПереход на Maven 3Автоматизация приёмочного, интеграционного и нагрузочного тестированияМоё знакомство с Maven 2
О васКто вообще не знает что такое Maven?
Кто использует для сборки Ant?
Кто начал мигрировать на Maven?
Кто уже использует Maven в своём проекте?
Кто считает себя экспертом в Maven?
Кто может собрать проект и задеплоить его на сервер одной командой?Maven или Ant?Придумай и сконфигурируйДелай как предлагают
Maven – набор лучших практик
Структура проекта по умолчанию
Куда бы положить исходники?src/   java    testsconfigs<build><sourceDirectory>src/java</sourceDirectory><testSourceDirectory>src/tests</testSourceDirectory><resources>	<resource>		<directory>src/configs</directory> 		</resource></resources></build>
Общая картинаRepositoryDEPLOYGETGETPluginsPOMArtifactBuild lifecycle
Project Object ModelЗависимости проектаИнформация о модуляхПлагины и порядок их выполненияСистема управления версиямиУправление поставкойИнформация про разработчиков, лиценизи, систему отслеживания ошибок
Репозитории90 000 артифактов70 ГБ ВнутреннийВнешниеЛокальный
Nexus как прокси-серверОт создателей Maven и менеджеров центрального репозиторияВозможность загрузки 3rd-party библиотек при помощи веб-интерфейсаПоддержка LDAPПланировщик задачРасширенный поиск по библиотекам и именам классов
Конфигурация и использованиеУвеличьте максимальный объём используемой памятиПо возможности используйте Linux-серверПод Windows используйте специальную конфигурациюОбязательно чистите snapshot-версииА потом не забывайте очистить корзину используя schedulerДелайте дефрагментацию дискаbin\jsw\conf\wrapper.confconf\examples\jetty-faster-windows.xml
Состояние диска (2 месяца работы)
Работа с артефактамиРазные типы: jar, war, zip, swfОдин модуль –артефактодного типаКоординаты артефакта<dependency><groupId>com.app</groupId>   <artifactId>myapp</artifactId>   <version>1.2.1</version>   <classifier>linux</classifier></dependency>Любая библиотекаРезультат сборки  Артефакт
Жизненный цикл сборкиvalidate, initialize
generate-sources, process-sources
generate-resources, process-resources
compile, process-classes
generate-test-sources, process-test-sources
generate-test-resources, process-test-resources
test-compile, process-test-classes
test
prepare-package, package
pre-integration-test, integration-test, post-integration-test
verify, install, deployПлагины,фазы и целиmvn installmvn resources:resources \compiler:compile \resources:testResources \compiler:testCompile \surefire:test \    jar:jar \install:install
Default goal<project><build>    <defaultGoal>install</defaultGoal></build></project>Возможно прописать только один goal или phase
maven-enforcer-pluginПроверка определённой версииОС,Java и MavenПроверка наличия или отсутствия определённых файловВозможно запрета использования определённых версий библиотекВозможно написания своих правил и выполнения скриптов
maven-ant-pluginОчень простоОчень полезно
...<dependencies>    <dependency>        <groupId>ant-contrib</groupId>        <artifactId>ant-contrib</artifactId>    </dependency>    <dependency>        <groupId>xdoclet</groupId>        <artifactId>xdoclet-hibernate-module</artifactId>    </dependency></dependencies>    <executions>      <execution>        <configuration>        <tasks>          <taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="maven.compile.classpath" />          <taskdef resource="net/sf/antcontrib/antcontrib.properties”/>          <ejbdocletdestDir="${basedir}/src/generated" ejbspec="2.0” force="false"    verbose="false”/>        </tasks>...Проблема в Maven2 – невозможно перегрузить зависимости для плагина. Решена в Maven3.
<id>populate</id><phase>process-resources</phase><configuration>	<tasks>		<property file=“developer.properties" />		<ant dir="${basedir}" antfile="init.xml" 		target="${init}"inheritAll="true" inheritRefs="true"><propertyset>				<propertyref prefix="database." />			</propertyset>			<property name="dataBase" value="${dataBase}” />		</ant>	</tasks></configuration>
      <plugin>        <artifactId>maven-ant-plugin</artifactId>        <executions>          <execution>            <id>execution1</id>           ...      <goals><goal>run</goal></goals>          </execution>          <execution>            <id>execution2</id>            ...				<goals><goal>run</goal></goals>          </execution>        </executions>      </plugin>Порядок выполнения зависит от порядка появления в POM-е, при условии что прописаны id
maven-dependency-pluginСкачать все зависимостиmvn dependency:go-offlineДревовидная структура списка зависимостейmvn dependency:treeОпределение неиспользуемых зависимостейmvn dependency:analyzeИсключение транзитных зависимостей будет исправлено в Maven 3.1 [MNG-2315]Анализируйте и исключайте ненужные зависимости
Пример анализа неиспользуемых зависимостей
<*Management> враг “копипаста”<dependencyManagement>Наследование версий зависимостей<pluginManagement>Наследование версий зависимостейи их конфигураций
In the basepom.xml … <pluginManagement>	<plugins>		<plugin>            <groupId>org.apache.maven.plugins</groupId>			<artifactId>maven-antrun-plugin</artifactId>			<version>1.1</version>			<executions>				<execution>					<id>echodir</id>					<goals>						<goal>run</goal>					</goals>					<phase>install</phase>					<configuration>						<tasks><echo>Build Dir: ${project.build.directory}</echo>						</tasks>					</configuration>				</execution>			</executions>		</plugin>	</plugins></pluginManagement>

Maven 3 : уличная магия

Editor's Notes

  • #23 http://maven.apache.org/guides/mini/guide-configuring-plugins.html