【问题标题】:Java platform: How to manage Configuration Settings for each DeveloperJava 平台:如何管理每个开发人员的配置设置
【发布时间】:2010-07-28 10:26:28
【问题描述】:

受这个问题的启发:

How to manage Configuration Settings for each Developer

如何管理必须为每个开发人员设置的应用程序配置设置而不将它们检查到 Java 平台上的源代码管理

例如,这就是我们现在正在做的事情:

  • 数据源配置存储在 Spring 配置 xml 文件中。

  • 目前,每个开发人员都会编辑该文件并尽最大努力不将该文件提交到源代码管理中。我们中的一些人在对我们的本地数据库执行测试之前将补丁(差异文件)应用于代码,并在签入代码之前删除补丁。其他开发人员手动编辑和恢复配置文件。

  • 很遗憾,补丁已经过时了。人们有时会忘记在提交之前恢复他们的本地配置。

但是,我的问题不仅限于数据库连接设置。我想找到一个解决方案,每个开发人员都可以覆盖应用程序配置设置,而无需更改源代码控制文件。

如果我们必须改变存储配置设置的方式,那么我认为我们应该这样做(可能是 JNDI?,众所周知路径中的外部配置文件?,我不知道)

你会做什么/你做了什么?

【问题讨论】:

    标签: java configuration-files


    【解决方案1】:

    将配置文件放在外部目录中。如果不存在,请读取默认配置文件。外部目录可以配置,并且可以有一个默认值,比如c:\workspace\config

    或者,在构建过程中,您可以将外部属性复制到构建工件中。

    【讨论】:

    • 我也想过这样做。 Maven 使用类似的方法:它查找 $MAVEN_HOME/settings.xml 文件。如果没有,则使用配置默认值。唯一的问题是如何解决 Windows 和 *nix 中路径的跨平台问题。也许使用 $MY_SYSTEM_HOME 的环境变量方法就足够了。谢谢!
    【解决方案2】:

    我们使构建完全独立,包括本地 H2/Hipersonic/JavaDB 数据库和 Ruby 邮件服务器。这意味着本地构建没有开发人员特定的配置,所有内容都指向预打包的组件。这也意味着除了基础知识(JVM、Ruby、编辑器)之外,配置开发人员框的时间为零。

    缺点是您的代码检查有点大。

    【讨论】:

    • 这听起来很不错。恐怕我们的构建和配置管理还没有达到自动化水平,但这是一个很好的答案。谢谢。
    【解决方案3】:

    将模板文件(如 sample.context.xml)签入源代码管理。每个开发人员将该文件复制到 context.xml 并进行他喜欢的任何修改。如果真正的配置文件位于源代码控制的目录中,请将其添加到 svn:ignore 以防止意外签入。

    ==> 没有意外提交,以及持久的本地配置设置。

    如果本地配置文件丢失,应用程序不会启动。这让新团队成员可以清楚地看到设置可以进行配置。显然,连续集成服务器也需要一个本地设置文件。

    至于在哪里放置该配置:如果特定于实例的配置不是 .war 文件的一部分,它会使构建和部署更容易。我们使用 JNDI 条目,使用 <j2ee:jndiLookup> 从 spring 配置文件中很容易查找这些条目。

    【讨论】:

    • 这很有意义,在我的情况下这将是简单(更接近)的解决方案,因为我已经在使用源代码控制文件。我们只需要将它们添加到忽略列表中。谢谢
    【解决方案4】:

    进行这些配置的最佳位置是数据库。并在您的生产代码中添加几行来读取这些配置。只要目的得到解决,一切都是一致和连贯的,这意味着没有伤害。安装一个读取这些配置并覆盖生产中出现的默认配置的小框架。

    幸运的是,像 Rails 这样的一些框架确实提供了这些,我很确定它在 Java 中也很灵活。

    【讨论】:

    • 是的,数据库方式恐怕不是我最喜欢的。这是我尝试过的唯一方法,但我发现了 2 个缺点: 1)您倾向于使用并非总是最好的结构的类似表的配置结构或不易编辑的 xml 字段 blob; 2)您必须以某种方式在数据库之外再次解决数据库连接设置的问题。
    【解决方案5】:

    我们在这里做的一件事是有一个属性加载器,它首先检查系统属性。

    例如你有一个名为 datasource.url 的属性,它会被加载到你的 Spring 文件中。

    我们扩展了 ResourceLoader 以首先检查系统属性以查看是否存在具有该名称的属性,如果存在,它将加载它而不是使用属性文件中的值。 (实际上,我认为 Spring 的 ResourceBundleMessageSource 如果您对其进行配置,它会开箱即用,但我们想要一些我不会介绍的自定义行为)。

    所以,如果我们用一些额外的命令行参数启动我们的应用程序:

    -Ddatasource.url=[local-datasource-url]

    然后它会覆盖属性文件中的值。

    显然,对于 Swing 应用程序(我们的应用程序)来说,这比 Web 应用程序更容易做到,但仍有可能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多