Предистория:
С недавних пор решил перебраться с
Ant на
Maven. Причины? они просты - в Maven неплохо реализована работа с зависимостями (которую я активно использую в Eclipse), но мне было неудобно каждый раз выискивать и копировать эти зависимости ручками на сервер (что тестовый, что "боевой"). В итоге было решено перебраться полностью. А там, где возможностей не хватает, то использовать
Antrun плагин, позволяющий использовать ant-скрипты.
Итак, лирика закончилась. Приступим к реализации цели поста.
Имеется исходная задача:
1) набор зависимостей для проекта (здесь и далее подразумевается разработка WAR-архива)
2) "боевой" удалённый сервер
3) тестовый удалённый сервер (отличается от "боевого" настройками для отладки)
4) на серверах установлен
Tomcat6 с настроенной поддержкой shared-lib
Первая проблема, с которой я столкнулся, была возможность указания в конфигурации единого правила для копирования зависимостей на разные сервера "по запросу".
Для определения dependency-библиотек, которые будут копироваться в shared-каталог tomcat, будем использовать указание scope как provided (подробнее про scope читать на русском тут)
Несколько продолжительные изыскания привели к следующей схеме профилей:
- профиль "development" - указываем свойства, специфичные для сервера разработки, такие как пути и логины/пароли
- профиль "production" - указываем свойства, специфичные для "боевого" сервера (всё те же пути и логины/пароли)
- профиль "dependency" - в этом профиле описываем плагины (и их работу), отвечающие за копирование зависимостей на выбранный сервер
пример профиля "development" (для профиля "production" подставляются другие значения свойств):
<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 "заставляет" нас придерживаться строгой структуры каталогов (что тоже можно немного изменить) и последовательностей сборки проекта.