我开发了一个在本地(我的开发环境)的Apache Tomcat 7.0.14服务器上运行的Web应用程序。我准备将我的应用程序推送到生产主机,但是我遇到了管理每个环境的不同条目值的问题。
我当前的构建过程完全在我的Netbeans 7.0.1 IDE中执行。它使用Ant,这是我承认我不熟悉的东西,并生成一个.war文件。我可以通过复制此.war文件来部署到我的生产主机。应用程序运行,但缺少所有正确的生产配置数据。
我已将我的应用程序编写为可合理配置。与大多数应用程序一样,我的开发环境和生产环境之间的各种数据必须有所不同。我能够将所有这些数据分成我的部署描述符(web.xml)或上下文配置(context.xml)文件,然后在我的应用程序中读取它。值的详细信息并不特别相关,但作为示例,至少有一个资源引用值用作DataSource。
我无法做的是为我的不同配置轻松维护单独的值。我希望得到web.xml或context.xml文件的第二个副本,我可以使用它来构建一个单独的.war文件副本以部署到生产环境。我也很满意一个允许我在这个文件中插入某种变量($ {}?)的解决方案。但是,我必须能够将数据本身保存在文件中,因为会有大量条目。由于数据将以文件的形式存在,我认为自然的解决方案是第二个web.xml或context.xml文件。
理想情况下,我想在Netbeans中使用简单的解决方案。缺乏这一点,在Ant中执行此操作的说明可能就足够了。任何相关的术语也会有所帮助。我已经忘记了关于tomcat中的“上下文”,“环境”和“部署”的阅读,这些内容的含义不同于我正在寻找的内容。最后,如果无法通过其中任何一种方式完成,是否有可以提供帮助的工具?编写一个独特的shell脚本将远非理想。
很难相信没有一个简单的解决方案。这似乎是每个部署都需要解决的问题。这不是为什么xml中存在条目和引用?但是,我在Tomcat手册中找不到任何相关内容。
答案 0 :(得分:2)
你有很多选择。对于构建特定属性,我建议为每个环境创建属性文件,并通过Ant中的property
任务加载它们。例如,假设环境 dev , qa , prod ,您可以拥有名称为build的属性文件。 {env} < /em>.properties,并按如下方式加载它们:
的build.xml
<property file="build.${environment}.properties"/>
调用为:
ant -Denvironment = dev
这为您提供了一些有用的构建时间属性替换。但是,当然,您更感兴趣的是替换项目文件中的变量。其中一种方法是使用Ant Replace Task。用法示例:
<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视为构建工具,它使这样的任务变得更加容易!