Maven部署到多个Tomcat服务器

Maven部署到多个Tomcat服务器,tomcat,maven-2,build-process,Tomcat,Maven 2,Build Process,使用maven将war部署到多个tomcat服务器的最简单示例是什么 我尝试了以下URL并询问了邮件列表,但没有找到任何简短且简单有效的方法 示例中应该在某个地方定义服务器(使用示例用户名/密码)也许“最简单”的解决方案根本不是最简单的。如果在maven中执行此操作时遇到问题,请尝试使用ant:创建两个不同的部署任务(每个服务器一个)和另一个将它们作为依赖项的任务。下面有几个示例说明如何使用ant部署到tomcat服务器。 要做到这一点,您需要将新的ant任务集成到maven中,这一点使用

使用maven将war部署到多个tomcat服务器的最简单示例是什么

我尝试了以下URL并询问了邮件列表,但没有找到任何简短且简单有效的方法

示例中应该在某个地方定义服务器(使用示例用户名/密码)

也许“最简单”的解决方案根本不是最简单的。如果在maven中执行此操作时遇到问题,请尝试使用ant:创建两个不同的部署任务(每个服务器一个)和另一个将它们作为依赖项的任务。下面有几个示例说明如何使用ant部署到tomcat服务器。
要做到这一点,您需要将新的ant任务集成到maven中,这一点使用插件并不困难。

Markus Lux的思想也可以应用于Maven2解决方案,配置文件管理:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
        </plugin>
    </plugins>
    ...
</build>
<profiles>
    <profile>
        <id>env-foo1</id>
        <!-- Activated when -Denv=foo1 is given as parameter. -->
        <activation>
            <property>
                <name>env</name>
                <value>foo1</value>
            </property>
        </activation>
        <properties>
            <deploy.env>xxx</deploy.env>
            <tomcat.manager>http://foo1/manager</tomcat.manager>
            <tomcat.manager.username>foo</tomcat.manager.username>
            <tomcat.manager.password>bar</tomcat.manager.password>
        </properties>
    </profile> 
    <profile>
        <id>env-foo2</id>
        <!-- Activated when -Denv=foo2 is given as parameter. -->
        <activation>
            <property>
                <name>env</name>
                <value>foo2</value>
            </property>
        </activation>
        <properties>
            <deploy.env>dev</deploy.env>
            <tomcat.manager>http://foo2/manager</tomcat.manager>
            <tomcat.manager.username>foo</tomcat.manager.username>
            <tomcat.manager.password>bar</tomcat.manager.password>
        </properties>
    </profile>
    ... 
</profiles>    

org.codehaus.cargo
持续集成服务器。我对这个特性做了一个简短的解释

基本上,您只需在Hudson中定义一个“普通”的Maven2作业,通过矩阵功能,您可以让Hudson运行此作业数次,每个环境运行一次。换句话说,创建Hudson作业,然后使用环境参数的所有可能值定义“环境轴”:

  • foo1
  • 食物2
  • foo3
然后,Hudson将使用mvn命令和参数-Denv=foo1构建应用程序。一旦构建完成,它将使用参数-Denv=foo2构建相同的应用程序,以此类推

这样,Hudson将在每个环境中部署您的应用程序


我希望我的解决方案能帮助您实现目标……

这个答案适用于Jetty和稍微不同的情况,但您可能会发现它很有用

在之前的一个项目中,我们使用了Jetty,因此我编写了一个简单的Jetty deployer模块,该模块将定期扫描maven存储库,并在新工件可用时下载和部署它们。这在一个小型的登台和开发机器集群上运行良好

您可以在项目中的谷歌代码中找到代码


请注意,我们只对开发和暂存服务器执行此操作。在我看来,生产应用程序永远不应该自动升级。

关于使用多个配置文件,生命周期似乎重复了某些步骤-例如,使用由变量激活的配置文件时,测试数量翻了一番。我们发现使用catalina ant库更有效;)而且它更“最小”。使用“executions”元素将“run”目标附加到生命周期阶段以简化它,或者在package: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>

org.apache.maven.plugins
maven antrun插件
1.6
雄猫
卡特琳娜蚂蚁
6.0.29

上面使用的catalina ant的特定版本是手动部署到我们的分布式maven存储库中的,可以在tomcat发行版的lib目录中找到。

这是对一个老问题的一个很晚的回答,但我确信人们会对它感兴趣。我刚刚实现了使用maven和ant任务运行多个部署。秘密在于使用macrodef(我在jetty中热部署我的应用程序,需要传输war和xml文件时使用macrodef),并使用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>
等等。。。在所使用的每个服务器配置的选项块上

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


诀窍是在ant中使用@{}作为属性评估${}优先级的macrodef属性。

真的,我希望能有一个例子。天哪,这可能非常有用,因为Hudson正是我使用它的目标…有趣的是,这与我给出的链接所建议的相似,但这并不十分清楚。迫不及待地想尝试一下。有没有一种不用打电话给maven X次就可以做到的方法?在我看来,仅仅为了部署而再次构建是非常耗时的,而且如果在这些构建过程中对代码进行了新的更改,那么可能会导致跨集群部署不合适
<deploy-app config="<config>"/>