С недавних пор решил перебраться с Ant на Maven. Причины? они просты - в Maven неплохо реализована работа с зависимостями (которую я активно использую в Eclipse), но мне было неудобно каждый раз выискивать и копировать эти зависимости ручками на сервер (что тестовый, что "боевой"). В итоге было решено перебраться полностью. А там, где возможностей не хватает, то использовать Antrun плагин, позволяющий использовать ant-скрипты.
Итак, лирика закончилась. Приступим к реализации цели поста.
Имеется исходная задача:
1) набор зависимостей для проекта (здесь и далее подразумевается разработка WAR-архива)
2) "боевой" удалённый сервер
3) тестовый удалённый сервер (отличается от "боевого" настройками для отладки)
4) на серверах установлен Tomcat6 с настроенной поддержкой shared-lib
Первая проблема, с которой я столкнулся, была возможность указания в конфигурации единого правила для копирования зависимостей на разные сервера "по запросу".
Для определения dependency-библиотек, которые будут копироваться в shared-каталог tomcat, будем использовать указание scope как provided (подробнее про scope читать на русском тут)
Несколько продолжительные изыскания привели к следующей схеме профилей:
- профиль "development" - указываем свойства, специфичные для сервера разработки, такие как пути и логины/пароли
- профиль "production" - указываем свойства, специфичные для "боевого" сервера (всё те же пути и логины/пароли)
- профиль "dependency" - в этом профиле описываем плагины (и их работу), отвечающие за копирование зависимостей на выбранный сервер
<profile> <id>development</id> <properties> <hostname>servername.dev</hostname> <ssh.host>${hostname}</ssh.host> <ssh.username>логин</ssh.username> <ssh.password>пароль</ssh.password> <ssh.tomcat.lib.shared>/srv/tomcat/shared/lib</ssh.tomcat.lib.shared> </properties> </profile>
Теперь перейдём к самому "сложному" - копированию зависимостей на сервер.
для этого потребуется 2 шага - сбор зависимостей и, собственно, само их копирование.
Для сбора зависимостей, воспользуемся плагином maven-dependency-plugin, для которого укажем некоторые нюансы его работы:
<plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.1</version> <executions> <execution> <id>10-copy-dependencies</id> <phase>process-resources</phase> <goals><goal>copy-dependencies</goal></goals> <configuration> <IncludeScope>provided</IncludeScope> <outputDirectory>${project.build.directory}/dependency</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin>
Кратко поясню, что здесь написано.
1) указано выполнение плагина с моими настройками на этапе работы с ресурсами (process-resources) проекта. подробнее про Lifecicle проекта можно глянуть тут
2) указываем, какие (IncludeScope) и куда (outputDirectory), а так же режим копирования
Теперь перейдём к шагу копирования полученных зависимостей на удалённый сервер. Для этого воспользуемся ant задачей scp
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.4</version> <executions> <execution> <id>90-antrun-copy-dependencies</id> <phase>process-resources</phase> <goals><goal>run</goal></goals> <configuration> <tasks> <scp todir="${ssh.username}@${ssh.host}:${ssh.tomcat.lib.shared}" password="${ssh.password}"> <fileset dir="target/dependency" /> </scp> </tasks> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>ant</groupId> <artifactId>ant-jsch</artifactId> <version>1.6.5</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.42</version> </dependency> </dependencies> </plugin>
Кратко поясню, что здесь написано:
1) Указано выполнение плагина maven-antrun-plugin с моими настройками на этапе работы с ресурсами (process-resources) проекта
2) Для выполнения плагина подключены необходимые зависиимости, доступные только на этапе работы плагина (требуются для scp-задачи)
Теперь описанные выше два плагина мы добавляем в профиль "dependency" следующим образом:
<profile> <id>copy-dependency</id> <build> <finalName>${hostname}</finalName> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> ... </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> ... </plugin> </plugins> </build> </profile>
На этом конфигурирование Maven для проекта закончилось.
Следующий шаг - настройка запуска сборок в eclipse для проекта maven.
воспользуемся плагином m2eclipse и в диалоге Run>Run configurations... создадим 2 конфигурации:


В профиле мы указываем сразу 2 профиля - один (например "development") используется для предоставления свойств, а второй ("dependency") реализует процедуру копирования зависимостей на сервер согласно указанных свойств
Так же мы указываем 2 шага выполнения Maven - clean (очистка от предыдущей сборки) и работу с ресурсами (process-resources).
Итог:
создавая и комбинируя различные профили, можно добиться практически такой же гибкости как у Ant, при этом Maven "заставляет" нас придерживаться строгой структуры каталогов (что тоже можно немного изменить) и последовательностей сборки проекта.
Если вам пригодилась статья, то отправьте 5 рублей автору. Спасибо!
Комментариев нет:
Отправить комментарий