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

11,476 views

Published on

Полной автоматизацией процесса сборки приложения уже никого не удивишь. Не в последнюю очередь благодаря Maven – системе управления жизненным циклом проекта. Однако проекты растут очень быстро: увеличивается количество модулей, тестов, зависимостей, используемых плагинов. И всего лишь за год легковесный проект, на сборку которого уходило 5 минут, превращается в монстра, который пожирает время разработчиков 30-минутной сборкой. Чтобы справится с этой проблемой разработчикам приходится постоянно чистить свой код и бороться со скоростью выполнения тестов. Это верное решение, но не следует забывать о том, что и сам процесс сборки можно улучшить. В этом докладе будет рассмотрено, как при помощи простых и нехитрых шагов можно оптимизировать работу с зависимостями и обогатить скрипты сборки полезными плагинами. Также будут обсуждаться тонкости конфигурации основных плагинов и особенности работы с командной строкой, которые появились в последней версии Maven.

Published in: Technology
0 Comments
16 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,476
On SlideShare
0
From Embeds
0
Number of Embeds
880
Actions
Shares
0
Downloads
0
Comments
0
Likes
16
Embeds 0
No embeds

No notes for slide
  • http://maven.apache.org/guides/mini/guide-configuring-plugins.html
  • Maven 3 : уличная магия

    1. 1. Maven 3:<br />уличная магия<br />Алексей Солнцев<br />JEEConf 2011<br />
    2. 2. Обо мне<br /><ul><li>Java и Flex aрхитектор в компанииInfopulse Ukraine
    3. 3. Certified Scrum Practitioner
    4. 4. Координатор перевода книг "Scrum and XP from the Trenches“ и“Kanban and Scrum – making the most of both”
    5. 5. Agile тренер в XP Injection</li></li></ul><li>Мой опыт работы с Maven<br />Завершился перевод проекта с Ant на Maven<br />Переход на Maven 3<br />Автоматизация приёмочного, интеграционного и нагрузочного тестирования<br />Моё знакомство с Maven 2<br />
    6. 6. О вас<br /><ul><li>Кто вообще не знает что такое Maven?
    7. 7. Кто использует для сборки Ant?
    8. 8. Кто начал мигрировать на Maven?
    9. 9. Кто уже использует Maven в своём проекте?
    10. 10. Кто считает себя экспертом в Maven?
    11. 11. Кто может собрать проект и задеплоить его на сервер одной командой?</li></li></ul><li>Maven или Ant?<br />Придумай и сконфигурируй<br />Делай как <br />предлагают <br />
    12. 12. Maven – набор лучших практик<br />
    13. 13. Структура проекта по умолчанию<br />
    14. 14. Куда бы положить исходники?<br />src/<br /> java <br /> tests<br />configs<br /><build><br /><sourceDirectory>src/java</sourceDirectory><br /><testSourceDirectory>src/tests</testSourceDirectory><br /><resources><br /> <resource><br /> <directory>src/configs</directory> <br /> </resource><br /></resources><br /></build><br />
    15. 15. Общая картина<br />Repository<br />DEPLOY<br />GET<br />GET<br />Plugins<br />POM<br />Artifact<br />Build lifecycle<br />
    16. 16. Project Object Model<br />Зависимости проекта<br />Информация о модулях<br />Плагины и порядок их выполнения<br />Система управления версиями<br />Управление поставкой<br />Информация про разработчиков, лиценизи, систему отслеживания ошибок<br />
    17. 17. Репозитории<br />90 000 артифактов<br />70 ГБ <br />Внутренний<br />Внешние<br />Локальный<br />
    18. 18. Nexus как прокси-сервер<br />От создателей Maven и менеджеров центрального репозитория<br />Возможность загрузки 3rd-party библиотек при помощи веб-интерфейса<br />Поддержка LDAP<br />Планировщик задач<br />Расширенный поиск по библиотекам и именам классов<br />
    19. 19.
    20. 20. Конфигурация и использование<br />Увеличьте максимальный объём используемой памяти<br />По возможности используйте Linux-сервер<br />Под Windows используйте специальную конфигурацию<br />Обязательно чистите snapshot-версии<br />А потом не забывайте очистить корзину используя scheduler<br />Делайте дефрагментацию диска<br />binjswconfwrapper.conf<br />confexamplesjetty-faster-windows.xml<br />
    21. 21. Состояние диска (2 месяца работы)<br />
    22. 22. Работа с артефактами<br />Разные типы: jar, war, zip, swf<br />Один модуль –артефактодного типа<br />Координаты <br />артефакта<br /><dependency><groupId>com.app</groupId>   <artifactId>myapp</artifactId>   <version>1.2.1</version>   <classifier>linux</classifier></dependency><br />Любая библиотека<br />Результат сборки <br />Артефакт<br />
    23. 23. Жизненный цикл сборки<br /><ul><li>validate, initialize
    24. 24. generate-sources, process-sources
    25. 25. generate-resources, process-resources
    26. 26. compile, process-classes
    27. 27. generate-test-sources, process-test-sources
    28. 28. generate-test-resources, process-test-resources
    29. 29. test-compile, process-test-classes
    30. 30. test
    31. 31. prepare-package, package
    32. 32. pre-integration-test, integration-test, post-integration-test
    33. 33. verify, install, deploy</li></li></ul><li>Плагины,фазы и цели<br />mvn install<br />mvn resources:resources <br />compiler:compile <br />resources:testResources <br />compiler:testCompile <br />surefire:test <br /> jar:jar <br />install:install<br />
    34. 34. Default goal<br /><project><br /><build><br /> <defaultGoal>install</defaultGoal><br /></build><br /></project><br />Возможно прописать только один goal или phase<br />
    35. 35. maven-enforcer-plugin<br />Проверка определённой версииОС,Java и Maven<br />Проверка наличия или отсутствия определённых файлов<br />Возможно запрета использования определённых версий библиотек<br />Возможно написания своих правил и выполнения скриптов<br />
    36. 36. maven-ant-plugin<br />Очень просто<br />Очень полезно<br />
    37. 37. ...<br /><dependencies><br /> <dependency><br /> <groupId>ant-contrib</groupId><br /> <artifactId>ant-contrib</artifactId><br /> </dependency><br /> <dependency><br /> <groupId>xdoclet</groupId><br /> <artifactId>xdoclet-hibernate-module</artifactId><br /> </dependency><br /></dependencies><br /> <executions><br /> <execution><br /> <configuration><br /> <tasks><br /> <taskdef name="ejbdoclet" <br />classname="xdoclet.modules.ejb.EjbDocletTask" <br />classpathref="maven.compile.classpath" /><br /> <taskdef resource="net/sf/antcontrib/antcontrib.properties”/><br /> <ejbdocletdestDir="${basedir}/src/generated" <br />ejbspec="2.0” force="false" <br /> verbose="false”/> <br /> </tasks><br />...<br />Проблема в Maven2 – невозможно перегрузить зависимости для плагина. Решена в Maven3.<br />
    38. 38. <id>populate</id><br /><phase>process-resources</phase><br /><configuration><br /> <tasks><br /> <property file=“developer.properties" /><br /> <ant dir="${basedir}" <br />antfile="init.xml" <br /> target="${init}"<br />inheritAll="true" <br />inheritRefs="true"><br /><propertyset><br /> <propertyref prefix="database." /><br /> </propertyset><br /> <property name="dataBase" value="${dataBase}” /><br /> </ant><br /> </tasks><br /></configuration><br />
    39. 39. <plugin><br /> <artifactId>maven-ant-plugin</artifactId><br /> <executions><br /> <execution><br /> <id>execution1</id><br /> ...<br /> <goals><br /><goal>run</goal><br /></goals><br /> </execution><br /> <execution><br /> <id>execution2</id><br /> ...<br /> <goals><br /><goal>run</goal><br /></goals><br /> </execution><br /> </executions><br /> </plugin><br />Порядок выполнения зависит от порядка появления в POM-е, при условии что прописаны id<br />
    40. 40. maven-dependency-plugin<br />Скачать все зависимости<br />mvn dependency:go-offline<br />Древовидная структура списка зависимостей<br />mvn dependency:tree<br />Определение неиспользуемых зависимостей<br />mvn dependency:analyze<br />Исключение транзитных зависимостей будет исправлено в Maven 3.1 [MNG-2315]<br />Анализируйте и исключайте ненужные зависимости<br />
    41. 41. Пример анализа неиспользуемых зависимостей<br />
    42. 42. <*Management> враг “копипаста”<br /><dependencyManagement><br />Наследование версий зависимостей<br /><pluginManagement><br />Наследование версий зависимостей<br />и их конфигураций<br />
    43. 43. In the basepom.xml … <br /><pluginManagement><br /> <plugins><br /> <plugin><br /> <groupId>org.apache.maven.plugins</groupId><br /> <artifactId>maven-antrun-plugin</artifactId><br /> <version>1.1</version><br /> <executions><br /> <execution><br /> <id>echodir</id><br /> <goals><br /> <goal>run</goal><br /> </goals><br /> <phase>install</phase><br /> <configuration><br /> <tasks><br /><echo>Build Dir: ${project.build.directory}</echo><br /> </tasks><br /> </configuration><br /> </execution><br /> </executions><br /> </plugin><br /> </plugins><br /></pluginManagement><br />
    44. 44. In the childpom.xml …<br /><plugins><br /> <plugin><br /> <artifactId>maven-antrun-plugin</artifactId><br /> </plugin><br /></plugins><br />
    45. 45. build-helper-maven-plugin<br />Добавить директорию с исходниками<br />Добавить директорию с ресурсами<br />Добавить директорию с тестами<br />Задеплоить несколько артефактов <br />Зарезервировать диапазон портов<br />
    46. 46. maven-cargo-plugin<br />Install, configure, start, stop container<br />Deploy, undeploy, merge application<br />
    47. 47. Командная строка<br />mvn --resume-from client-connector install<br />
    48. 48. Командная строка<br />mvn --projects client-connector, rest install<br />
    49. 49. Командная строка<br />mvn –projects services --also-make install<br />
    50. 50. Командная строка<br />mvn --projects services --also-make-dependents install<br />
    51. 51. Отладка<br />Стек-трейс ошибки<br />mvn <anygoal> -e<br />Отладочная информация<br />mvn <anygoal> -X<br />Отладка ядра Maven или плагинов<br />mvnDebug <anygoal> <br />Preparing to Execute Maven in Debug Mode <br />Listening for transport dt_socket at address: 8000<br />Отладка тестов<br />mvn test -Dmaven.surefire.debug<br />Listening for transport dt_socket at address: 5005 <br />
    52. 52. Предопределённые переменные<br />
    53. 53. Конфигурация памяти (1/3)<br />MAVEN_OPTS=-Xms256m -Xmx850m -XX:MaxPermSize=192m<br /><plugin><br /><artifactId>maven-compiler-plugin</artifactId><br /> <configuration><br /> <source>1.5</source><br /> <target>1.5</target><br /> <!-- impl module ishuge and requires<br />at least 768m to compile --><br /><fork>true</fork><br /> <meminitial>256</meminitial><br /> <maxmem>1024</maxmem><br /> </configuration><br /></plugin><br />
    54. 54. Конфигурация памяти (2/3)<br /><plugin><br /> <groupId>org.apache.maven.plugins</groupId><br /> <artifactId>maven-surefire-plugin</artifactId><br /> <configuration><br /><argLine>-Xmx256m</argLine><br /> </configuration><br /></plugin> <br />
    55. 55. Конфигурация памяти (3/3)<br /><plugin><br /> <groupId>org.codehaus.mojo</groupId><br /> <artifactId>cobertura-maven-plugin</artifactId> <br /> <version>2.5</version><br /> <configuration><br /> <check><br /> <haltOnFailure>false</haltOnFailure><br /> <maxmem>512m</maxmem><br /> </check><br /> <instrumentation><br /> <maxmem>512m</maxmem><br /> </instrumentation><br /> </configuration><br /></plugin> <br />
    56. 56. Будущее: Maven Polyglot<br />http://kaczanowscy.pl/tomek/2010-11/build-script-length-maven3-polyglot-maven-gradle-ant<br />Tomek's Blog<br />http://kaczanowscy.pl/tomek<br />
    57. 57. Пример POM файла на Groovy<br />project {<br />  modelVersion '4.0.0'<br />  artifactId 'coc-comparison'<br />  groupId 'grId'<br />  version '1.0-SNAPSHOT'<br />  dependencies {<br />    dependency('commons-lang:commons-lang:2.5')<br />    dependency('junit:junit:4.8.2')<br />  }<br />  properties {<br />    'maven.compiler.target' '1.6'<br />    'maven.compiler.source' '1.6'<br />  }<br />}<br />
    58. 58. Нужна помощь?<br />Email: aleksey.solntsev@gmail.com<br />aleksey.solntsev@xpinjection.com<br />Twitter:@a_solntsev<br />LinkedIn: http://www.linkedin.com/in/solntsev<br />

    ×