【问题标题】:Different build configurations in Eclipse and .properties fileEclipse 和 .properties 文件中的不同构建配置
【发布时间】:2014-12-27 23:46:12
【问题描述】:

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

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

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

如何使这一步自动化?

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

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

【问题讨论】:

  • 你是否使用任何构建工具,如 maven、gradle 或 ant?此类任务由 maven、资源过滤和配置文件处理。
  • @nomoa:不,我不知道。通过使用 Maven 是否可以保持相同的目录结构? Maven 构建过程在 /src/main/java 中找到源文件,但在 Eclipse 中它们位于 /src/ 文件夹中,我不会更改目录树。
  • Maven 设计为使用默认文件结构,因此通常比更改项目结构更难为自定义结构配置 maven。如果您真的不想更改项目结构,请选择更灵活的 Gradle。
  • 请注意,Eclipse 和 Maven 可以很好地协同工作。大部分的eclipse配置都是在eclipse读取maven pom.xml文件时自动完成的。我们仅在大部分项目中使用 maven,对于一些需要自定义内容的项目,我们使用 maven+gradle。
  • 为您的项目添加一个与 Eclipse 无关的构建工具是值得的。我可能会告诉您的最佳建议是使用构建工具(maven 或 gradle)配置您的项目。您提出的问题之类的事情将不再是问题。

标签: java eclipse build tomcat7 properties-file


【解决方案1】:

通常,恕我直言,最佳实践是从 webapp 外部化那些 .properties 文件(至少是每个“客户”将更改的文件)。这是因为我们不希望为每个“客户”(生产、演示、开发、客户 A、客户 X ......)构建自定义 webapp。您只需要一个版本的 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

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

如果你想在同一台机器上运行多个环境,你可以配置多个tomcat实例。基本上你只需要安装一次tomcat,然后,对于每个实例,你需要有不同的webapps、conf、logs、temp、work文件夹。您可以为每个实例创建一个 .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,${catalina .home}/lib,${catalina.home}/lib/.jar

所以,如果你需要在同一台机器上运行演示和生产环境,你必须有这样的东西:

tomcat_生产
|__ 网络应用
|__ 配置
| |__ configApp.properties(生产设置)
| |__ catalina.properties
| |__ (...)
|__ 日志
|__ 温度
|__ 工作
|__ startup.bat(将启动这个 tomcat 实例的脚本)

tomcat_demo
|__ 网络应用
|__ 配置
| |__ configApp.properties(演示设置)
| |__ catalina.properties
| |__ (...)
|__ 日志
|__ 温度
|__ 工作
|__ startup.bat(将启动这个 tomcat 实例的脚本)

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

【讨论】:

  • 问题是我只有一个用于演示和生产 webapp 的环境。现在我试图了解我是否必须设置多个 Tomcat,或者我是否可以使用构建工具以正确的方式选择 webapp 中的 .properties 来完成所有工作
【解决方案2】:

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

{$hg_version=hg 识别 -i 设置变量-名称语言-值“%sonar.language%” 设置变量-名称项目键-值“键” 设置变量-名称项目名称-值“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}) |设置内容 %sonarProperty%\sonar-project.properties}

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我知道我可以将configApp.properties 放在Tomcat lib 文件夹中。关键是我不仅有一个configApp.properties,还有一个用于演示应用程序,一个用于生产应用程序,一个用于测试应用程序。我会根据所选网络应用程序的类型构建应用程序并创建相关的 .war
    • 我的意思是你真的不想那样做。这是一个不能很好扩展的想法。如果您需要另一个版本来进行性能测试,并且需要另一个版本用于该特殊客户的特殊演示,会发生什么情况?对于您的用例,您通常有完全不同的 Tomcat 配置。生产可以在 maxThreads=200 的 4G 内存中运行。演示版可以在 1G 中运行,maxThreads=50。如果您在 server.xml 中声明了数据源,那么它们将指向不同的数据库服务器。 configApp.properties 是其中的一部分。
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 2012-09-18
    • 2010-09-15
    • 2011-02-19
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多