Eclipse和.properties文件中的不同构建配置

时间:2014-10-31 15:36:48

标签: java eclipse build tomcat7 properties-file

我有一个Eclipse项目,它使用带有struts 1.3.10框架的java。

我使用.properties文件(比如configApp.properties)来管理生产webapp,演示webapp和开发webapp。 此.properties文件在ServletContextListener和PropertyDecoder类中使用,该类实现IntrospectionUtils.PropertySource(请参阅this question)。

现在,我手动地根据我必须完成的任务更改configApp.properties(即构建新的生产版本)。

我怎样才能使这一步自动化?

由于.properties文件名对于三种类型的构建必须相同,我想创建三个文件夹,每个文件夹包含configApp.properties(一个用于生产,一个用于演示,一个用于开发)。

有没有更好的方法,例如通过将参数传递给构建(我认为这是不可能的'因为必须编译实现IntrospectionUtils.PropertySource的PropertyDecoder类并且将.class放在Tomcat lib文件夹中)?如果是这样,我如何参数化ServletContextListener和PropertyDecoder类,以便他们可以输入正确的.properties文件?

3 个答案:

答案 0 :(得分:1)

您可以通过外部化配置来完全避免构建不同版本的应用程序。

您可以将configApp.properties放入Tomcat" lib"可在应用程序类路径上访问的目录。从技术上讲,它将在" common"您的conf/catalina.properties文件中定义的类加载器。

然后可以使用Tomcat配置的其余部分对其进行源代码控制,这几乎总是特定于环境。

答案 1 :(得分:0)

创建一个模板,其中包含您手动更改的所有值作为参数。然后使用模板引擎将其转换为您需要的最终.properties文件。我使用的是powershell,但您也可以使用Freemarker Template Language。下面的powershell脚本采用模板文件,通过将templte中的关键字替换为定义的变量来应用转换。最终结果是.properties文件。

{$ hg_version = hg identify -i set-variable -name language -value“%sonar.language%” set-variable -name projectKey -value“Key” set-variable -name projectName -value“XXXXXX” set-variable -name openCoverResultxml -value“Trident.sln.CoverageReport.xml”

(get-content%sonarProperty%\ sonar-project.template | foreach-object {$ _ -replace“phrase_to_replace_A”,$ hg_version} | foreach-object {$ _ -replace“phrase_to_replace_B”,$ projectKey} | foreach -object {$ _ -replace“phrase_to_replace_C”,$ language} | foreach-object {$ _ -replace“phrase_to_replace_B”,$ projectName})| set-content%sonarProperty%\ sonar-project.properties}

请记住,此脚本不适用于FreeMarker,但有关于如何使用freemarker引擎的说明。 Powershell对我来说效果很好。您可以通过为每个配置组合创建构建来自动化该过程,以便传递给每个构建的变量将生成您手动创建的属性文件。 TeamCity在运行构建时允许下拉,因此您可以在构建时选择参数以传递给powershell /使用的任何模板引擎。

答案 2 :(得分:0)

通常情况下,最佳做法是恕我直言,将这些.properties文件(至少是那些将根据“客户”更改的文件)从webapp外部化。这是因为我们不希望为每个“客户”(生产,演示,开发,客户A,客户X,......)构建自定义Web应用程序。您只需要一个版本的webapp和多个版本的配置文件(每个“客户”一个)。

您可以配置自己的自定义配置文件夹。如果类加载器将查找资源,该文件夹将只是一个位置:

在tomcat_dir \ conf \ catalina.properties中,您可以像这样设置 common.loader 属性:

  

common.loader = <强> your_config_folder_path 下,$ {catalina.base} / lib中,$ {catalina.base} / LIB / 的.jar,$ {的catalina.home} / lib下,$ {的catalina.home} / LIB / 的.jar

因此,如果您现在需要为演示设置环境,您只需要在config文件夹中输入configApp.properties的演示版本。

如果要在同一台计算机上运行多个环境,可以配置多个tomcat实例。基本上你只需要安装一次tomcat,然后,对于每个实例,你需要有不同的webapps,conf,logs,temp,工作文件夹。您可以为每个实例创建一个.bat | .sh脚本。在该脚本中,您只需指定CATALINA_HOME环境变量,该变量可以指向父文件夹的相对路径(更通用)。
您可以谷歌“运行多个tomcat实例”或查看以下教程以获取更多详细信息: http://www.ramkitech.com/2011/07/running-multiple-tomcat-instances-on.html

我很高兴你将 common.loader 属性(在catalina.properties中)配置为指向$ {catalina.base} / conf文件夹:

  

common.loader = <强> $ {catalina.base} / CONF 下,$ {catalina.base} / lib中,$ {catalina.base} / LIB / 的.jar,$ {卡塔利娜。家里} / lib下,$ {的catalina.home} / LIB / 的.jar

因此,如果您需要在同一台计算机上运行演示和生产环境,则必须具有以下内容:

tomcat_production
| __ webapps
| __ conf
| | __ configApp.properties(生产设置)
| | __ catalina.properties
| | __(...)
| __日志
| __ temp
| __工作
| __ startup.bat(将启动此tomcat实例的脚本)

tomcat_demo
| __ webapps
| __ conf
| | __ configApp.properties(演示设置)
| | __ catalina.properties
| | __(...)
| __日志
| __ temp
| __工作
| __ startup.bat(将启动此tomcat实例的脚本)

我希望这会有所帮助......