有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Eclipse和java中使用不同的构建配置。属性文件

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

我用的是一个。属性文件(例如configApp.properties),用于管理生产webapp、演示webapp和开发webapp。 这属性文件在ServletContextListener和实现内省TILS的PropertyCoder类中使用。PropertySource(见this question

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

我如何使这一步自动化

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

是否有更好的方法,例如通过向构建传递参数(我认为这是不可能的,因为必须编译实现IntrospectionUtils.PropertySource的PropertyCoder类,并将.class放在Tomcat lib文件夹中)?如果是这样,我如何参数化ServletContextListener和PropertyCoder类,以便它们能够正确地接受输入。属性文件


共 (3) 个答案

  1. # 1 楼答案

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

    {$hg_version=hg identify-i 设置变量-名称语言-值“%sonar.language%” 设置变量-名称projectKey-值“Key” 设置变量-名称projectName-值“XXXXXX” 设置变量-name openCoverResultxml-value“Trident.sln.CoverageReport.xml”

    (获取内容%sonarProperty%\sonar-project.template | foreach对象{$\-replace“phrase_to_replace_A”、$hg_version}| foreach对象{$\-replace”phrase_to_replace_B”、$projectKey}foreach对象{$\-replace“phrase_to_replace___C”、$language}foreach对象{$\-replace”phrase“phrase to_replace_to_replace___ _ _ _(B”%sonarProperty%\sonar项目。属性}

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

  2. # 2 楼答案

    通常,最佳实践IMHO是将这些外部化。webapp中的属性文件(至少是每个“客户”将更改的文件)。这是因为我们不希望为每个“客户”(生产、演示、开发、客户a、客户X等)定制webapp构建。您只需要一个版本的webapp和多个版本的配置文件(每个“客户”一个)

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

    在tomcat_dir\conf\catalina中。属性,您可以设置公用项。加载程序属性,如下所示:

    common.loader=your_config_folder_path,${catalina.base}/lib,${catalina.base}/lib/.jar,${catalina.home}/lib,${catalina.home}/lib/.jar

    因此,如果您现在需要为演示设置环境,只需将您的演示版本configApp放入该配置文件夹中。财产

    如果希望在同一台机器上运行多个环境,可以配置tomcat的多个实例。基本上,您只需要安装一次tomcat,然后,对于每个实例,您需要有不同的webapps、conf、logs、temp和工作文件夹。您可以创建一个。蝙蝠。每个实例的sh脚本。在该脚本中,您只需指定CATALINA_HOME环境变量,该变量可以指向父文件夹的相对路径(更一般)
    您可以在google上搜索“运行tomcat的多个实例”,或查看以下教程以了解更多详细信息: http://www.ramkitech.com/2011/07/running-multiple-tomcat-instances-on.html

    我建议您配置公用程序。加载程序属性(在catalina.properties中)指向${catalina.base}/conf文件夹:

    common.loader=${catalina.base}/conf,${catalina.base}/lib,${catalina.base}/lib/.jar,${catalina.home}/lib,${catalina.home}/lib/.jar

    因此,如果您需要在同一台机器上运行演示和生产环境,您必须具备以下功能:

    tomcat_生产
    | uuuwebapps
    | uuuconf
    | | uuuuuu配置应用程序。属性(生产设置)
    卡塔琳娜。属性
       |        |__ (...)
    | uuuu日志
    | uuuuTemp
    | uuuu工作
    启动。bat(将启动此tomcat实例的脚本)

    tomcat_演示版
    | uuuwebapps
    | uuuconf
    | | uuuuuu配置应用程序。属性(演示设置)
    卡塔琳娜。属性
       |        |__ (...)
    | uuuu日志
    | uuuuTemp
    | uuuu工作
    启动。bat(将启动此tomcat实例的脚本)

    我希望这有助于

  3. # 3 楼答案

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

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

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