代码之家  ›  专栏  ›  技术社区  ›  cgp

Maven部署到多个Tomcat服务器

  •  19
  • cgp  · 技术社区  · 15 年前

    使用可以编写的Maven将战争部署到多个Tomcat服务器的最简单示例是什么?

    我尝试了以下网址,并询问了邮件列表,但没有想出任何短的和简单的工作。

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

    5 回复  |  直到 15 年前
        1
  •  25
  •   Community CDub    7 年前

    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>    
    

    然后,您只需要运行x次 MVN 命令,有足够的参数( -DeV= Foe1 , -DeV= ,…)


    除此之外,还可以使用 Hudson 持续集成服务器。我对这个特性作了简短的解释 here .

    基本上,您只需在Hudson中定义一个“正常”的Maven2作业,使用Matrix功能,您可以要求Hudson多次运行此作业,每个环境一次。换句话说,您创建了您的Hudson作业,然后定义了“环境轴”,其中包含了 埃恩 参数:

    • Foo1
    • 氧分压
    • 三氧化二铝

    然后,Hudson将使用 MVN 命令和参数 -DeV= Foe1 。此生成完成后,它将生成相同的应用程序,但使用参数 -DeV= 等等…

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

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

        2
  •  8
  •   Danielson David Grayson    9 年前

    关于使用多个配置文件,生命周期似乎重复了某些步骤——例如,当使用由变量激活的配置文件时,测试的数量增加了一倍。我们发现使用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>
    

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

        3
  •  2
  •   Danielson David Grayson    9 年前

    这是一个很晚才回答的老问题,但我相信人们会对此感兴趣。我刚刚实现了使用Maven和Ant任务运行多个部署。秘密是使用一个macrodef(对于我来说是2个,因为我在jetty中热部署了我的应用程序,需要传输一个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中的属性评估$的优先级。

        4
  •  1
  •   Markus    15 年前

    也许“最简单”的解决方案根本不是最简单的。如果在Maven中这样做有问题,请尝试使用Ant:创建两个不同的部署任务(每个服务器一个)和另一个将它们作为依赖项的任务。有几个例子说明如何使用Ant部署到Tomcat服务器。 Just google them . 完成这项工作后,您需要将新的Ant任务集成到Maven中,而使用 antrun 插件。

        5
  •  0
  •   Stefan Arentz    15 年前

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

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

    你可以在谷歌的代码中找到 Polar Rose Jetty Maven Deployer 项目。

    请注意,我们只为开发和登台服务器做了这项工作。在我看来,生产应用程序永远不应该自动升级。