使用可编写的maven将战争部署到多个tomcat服务器的最小例子是什么?
我已经尝试了以下网址并询问了邮件列表,但没有提出任何简短而简单的工作。
示例应该在示例中的某个地方定义服务器(带有示例用户名/密码)
答案 0 :(得分:25)
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 命令,并使用足够的参数( -Denv = foo1 , -Denv = foo2 ,...)
除此之外,您还可以使用Hudson Continuous Integration服务器的Matrix功能来增强此解决方案。我简要介绍了此功能here。
基本上,您只需在Hudson中定义一个“普通”Maven2作业,并且使用Matrix功能,您可以要求Hudson多次运行此作业,每个环境一个。换句话说,您创建了Hudson作业,然后使用 env 参数的所有可能值定义“环境轴”:
这样,Hudson将在各种环境中部署您的应用程序......
我希望我的解决方案可以帮助您实现目标......
答案 1 :(得分:8)
关于使用多个配置文件,生命周期似乎复制了某些步骤 - 例如使用变量激活的配置文件时,测试次数增加了一倍。我们发现使用catalina-ant库更有效;)它更“有用”。使用“executions”元素将“run”目标附加到生命周期阶段以简化它,或者在package之后运行:mvn package antrun:run
您可以使用ant-contrib库获得更多花哨,并创建一个带有服务器列表的for循环,但这里是2个硬编码服务器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发行版的lib目录中找到。
答案 2 :(得分:2)
对于一个老问题,这是一个很晚的答案,但我很确定人们会对它感兴趣。我刚刚实现了使用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中的属性评估$ {}。
答案 3 :(得分:1)
也许“最小”的解决方案根本不是最小的。如果您在maven中执行此操作时遇到问题,请尝试使用ant:创建两个不同的部署任务(每个服务器一个)和另一个将它们作为依赖项的任务。有几个例子说明如何使用ant部署到tomcat服务器。 Just google them。 完成此操作后,您需要将新的ant任务集成到maven中,使用antrun插件并不困难。
答案 4 :(得分:0)
这个答案适用于Jetty和略有不同的情况,但无论如何你可能会发现它很有用。
在之前的项目中,我们使用了Jetty,因此我编写了一个简单的Jetty部署程序模块,该模块将定期扫描maven存储库,并在它们可用时立即下载和部署新工件。这在一小部分登台和开发机器上运行良好。
您可以在Polar Rose Jetty Maven Deployer项目的Google代码中找到代码。
请注意,我们只对开发和登台服务器执行此操作。在我看来,生产应用程序永远不会自动升级。