我开发了一个web应用程序,它运行在本地Apache Tomcat 7.0.14服务器上(我的开发环境)。我已经准备好将我的应用程序推送到生产主机,但是我在管理每个环境的不同条目值时遇到了问题。
我当前的构建过程完全在我的Netbeans 7.0.1 IDE中执行。它使用Ant(我承认我不熟悉它),并生成一个.war文件。我可以通过复制这个.war文件部署到我的生产主机。应用程序运行,尽管它缺少所有正确的生产配置数据。
我已经把我的应用程序写得合理可配置。与大多数应用程序一样,在开发环境和生产环境之间,各种数据必须有所不同。我能够将所有这些数据分离到我的部署描述符(web.xml)或上下文配置(context.xml)文件中,然后在应用程序中读取它们。这些值的细节并不是特别相关,但是作为一个例子,至少有一个Resource引用值作为DataSource。
我无法做到的是为不同的配置轻松维护单独的值。我希望有web.xml或context.xml文件的第二个副本,我可以用它来构建一个.war文件的单独副本以部署到生产环境中。如果解决方案允许我在该文件中插入某种变量(${}?),我也会很高兴。但是,我必须能够在文件中维护数据本身,因为会有大量的条目。由于数据将在文件中,我认为自然的解决方案是第二个web.xml或context.xml文件。
理想情况下,我希望在Netbeans中有一个简单的解决方案。如果没有这些,在Ant中执行此操作的说明可能就足够了。任何相关的术语也会有所帮助。我在阅读tomcat中的"上下文"、"环境"one_answers"部署"时迷失了方向,它们的含义与我所寻找的含义不同。最后,如果这两种方法都无法实现,那么是否有一种工具可以提供帮助?写一个不同的shell脚本是很不理想的。
很难相信这个问题没有一个简单的解决方案。这似乎是每个部署都需要解决的问题。这不就是条目和引用存在于xml中的原因吗?但是,我在Tomcat手册中找不到任何相关内容。
你有很多选择。对于构建特定的属性,我建议为每个环境创建属性文件,并通过Ant中的property
任务加载它们。例如,假设环境dev, qa, prod,您可以使用名称为build.{env}的属性文件。属性,并像这样加载:
build . xml
<property file="build.${environment}.properties"/>
调用:
ant -Denvironment = dev
这为您提供了一些有用的构建时属性替换。当然,您更感兴趣的是替换项目文件中的变量。其中一种方法是使用Ant替换任务。示例用法:
<target name="prepare-resources">
<replace dir="${targetdir}" replacefilterfile="vars.${environment}.properties">
<include name="**/*.txt"/>
</replace>
</target>
您将调用与我给出的第一个示例类似的Ant构建。您可以使用额外的include
指令添加任意多的资源类型。
最后,您还可以选择使用环境标识符标记一整套文件,并使用Ant Copy Task将它们"提升"到所需的构建工件。例如:
<target name="promote-resources">
<copy todir="${targetdir}">
<fileset dir="${sourcedir}"/>
<mapper type="regexp" from="(.*).${environment}.(.*)" to="1.2"/>
</copy>
</target>
根据需要填写targetdir
和sourcedir
。上面的代码片段会将所有类型为web.dev.xml或context.dev.xml的文件提升为web.xml和context.xml。
您可以结合以上所有或部分方法来获得适合您环境的高度定制的构建。我还建议将Maven视为构建工具,它使这样的任务更容易完成!