Развертывание Maven на нескольких серверах Tomcat

Каков самый минимальный пример развертывания войны на нескольких серверах tomcat с использованием maven, который можно написать?

Я попробовал следующие URL-адреса и запросил список рассылки, но не нашел ничего, что было бы коротким и просто работало.

В примере должны быть серверы, определенные в примере где-то (с образцами имен пользователей/паролей)


person cgp    schedule 08.04.2009    source источник


Ответы (5)


Что касается использования нескольких профилей, жизненный цикл, похоже, дублировал определенные шаги, например. количество тестов увеличилось вдвое при использовании профилей, активируемых переменными. Мы обнаружили, что использование библиотеки catalina-ant было намного эффективнее ;) и более «минимальным». Используйте элемент «выполнения», чтобы привязать цель «выполнить» к фазе жизненного цикла, чтобы упростить ее, или запускать после пакета: mvn package antrun:run

Вы могли бы немного пофантазировать с библиотекой ant-contrib и создать цикл for со списком серверов, но вот статическая конфигурация для двух жестко закодированных URL-адресов серверов.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <configuration>
        <target>
            <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/>
            <deploy url="http://tc-app-01:8080/manager" username="manager" password="pass"
                    path="/app-path" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/>

            <deploy url="http://tc-app-02:8080/manager" username="manager" password="pass"
                    path="/app-path" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/>
        </target>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>catalina-ant</artifactId>
            <version>6.0.29</version>
        </dependency>
    </dependencies>
</plugin>

Конкретная версия catalina-ant, использованная выше, была вручную развернута в нашем распределенном репозитории maven, ее можно найти в каталоге lib дистрибутива tomcat.

person Brett Cave    schedule 06.01.2011

Это довольно поздний ответ на старый вопрос, но я уверен, что людям это будет интересно. Мне только что удалось запустить несколько развертываний, используя задачи maven и ant. Секрет в том, чтобы использовать макрос (или 2 для меня, так как я развертываю свои приложения в причале и мне нужно передать файл war и xml) и использовать файл свойств ant:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <phase>install</phase>
            <configuration>
                <tasks>
                    <taskdef name="scp"
                        classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp"
                        classpath="/usr/local/java/ant/lib/ant-jsch.jar:/usr/local/java/ant/lib/jsch-0.1.45.jar" />
                    <macrodef name="deploy">
                        <attribute name="server" default="NOT SET" />
                        <attribute name="file" default="NOT SET" />
                        <attribute name="todir" default="NOT SET" />
                        <attribute name="port" default="NOT SET" />
                        <attribute name="passphrase" default="NOT SET" />
                        <attribute name="keyfile" default="NOT SET" />
                        <sequential>
                            <echo message="Deploying to @{server}" />
                            <echo message="Deploying @{file} to @{todir}" />
                            <scp
                                file="@{file}" todir="@{todir}"
                                port="@{port}" passphrase="@{passphrase}"
                                keyfile="@{keyfile}" />
                        </sequential>
                    </macrodef>
                    <macrodef name="deploy-app">
                        <attribute name="config" default="NOT SET" />
                        <sequential>
                            <property file="deploy.properties"/>
                            <echo message="Deploying to @{config}" />
                            <deploy server="${@{config}.jetty.server.host}"
                                    file="${project.build.directory}/${project.build.finalName}.${project.packaging}"
                                    todir="${@{config}.jetty.server.user}@${@{config}.jetty.server.host}:${@{config}.jetty.server.baseDir}/${@{config}.jetty.server.webappsDir}"
                                    port="${@{config}.jetty.server.port}"
                                    passphrase="${@{config}.jetty.server.passphrase}"
                                    keyfile="/home/steff/.ssh/id_rsa"/>
                            <deploy server="${@{config}.jetty.server.host}"
                                    file="${project.build.finalName}.xml"
                                    todir="${@{config}.jetty.server.user}@${@{config}.jetty.server.host}:${@{config}.jetty.server.baseDir}/${@{config}.jetty.server.contextDir}"
                                    port="${@{config}.jetty.server.port}"
                                    passphrase="${@{config}.jetty.server.passphrase}"
                                    keyfile="/home/steff/.ssh/id_rsa"/>                                     
                        </sequential>
                    </macrodef>                             
                    <deploy-app config="home"/>     
                    <deploy-app config="wap"/>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Тогда ваш файл свойств должен быть примерно таким:

home.jetty.server.user=
home.jetty.server.port=
home.jetty.server.host=
home.jetty.server.baseDir=
home.jetty.server.webappsDir=
home.jetty.server.contextDir=
home.jetty.server.passphrase=
wap.jetty.server.user=
wap.jetty.server.port=
wap.jetty.server.host=
wap.jetty.server.baseDir=
wap.jetty.server.webappsDir=
wap.jetty.server.contextDir=
wap.jetty.server.passphrase=

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

<deploy-app config="<config>"/>

Хитрость заключается в том, что атрибут macrodef использует @{} в качестве приоритета над оценкой свойства ${} в ant.

person Snicolas    schedule 14.01.2012

Возможно, «самое минимальное» решение вовсе не минимальное. Если у вас есть проблемы с выполнением этого в самом maven, попробуйте использовать ant: создайте две разные задачи развертывания (по одной на сервер) и другую задачу, которая имеет их в качестве зависимостей. Есть несколько примеров развертывания на сервере Tomcat с помощью ant. Просто погуглите. Сделав это, вам нужно интегрировать новые задачи ant в maven, что совсем не сложно, используя antrun.

person Markus    schedule 18.04.2009
comment
Правда, я надеялся на пример. - person cgp; 21.04.2009

Этот ответ предназначен для Jetty и для немного другой ситуации, но вы все равно можете найти его полезным.

В предыдущем проекте мы использовали Jetty, поэтому я написал простой модуль развертывания Jetty, который периодически сканировал репозиторий maven, загружал и развертывал новые артефакты, как только они становились доступными. Это хорошо работало на небольшом кластере машин для подготовки и разработки.

Вы можете найти код в Google Code в Polar Rose Jetty Maven Deployer проект.

Обратите внимание, что мы сделали это только для серверов разработки и промежуточных серверов. На мой взгляд, рабочие приложения никогда не должны обновляться автоматически.

person Stefan Arentz    schedule 23.04.2009

person    schedule
comment
Святое дерьмо, это потенциально чрезвычайно полезно, так как Хадсон — это именно то, на что я нацелился, используя это в…. - person cgp; 21.04.2009
comment
Забавно то, что это похоже на то, что предлагала ссылка, которую я дал, но это не совсем ясно. Не могу дождаться, чтобы попробовать это. - person cgp; 21.04.2009
comment
Есть ли способ сделать это без вызова maven X раз? мне кажется, что повторная сборка только для развертывания занимает много времени, плюс это может привести к несогласованным развертываниям в кластере, если во время этих сборок было зафиксировано новое изменение в коде. - person maverick; 02.08.2012