【问题标题】:Which is the best Approach or Best Practices to leave properties files in a Separated Java Project?将属性文件留在分离的 Java 项目中的最佳方法或最佳实践是什么?
【发布时间】:2013-03-15 02:11:30
【问题描述】:

我有一个单独的项目:

  • a) 业务层(包含所有核心 Java 类和一些配置(服务等))和
  • b) Presentation Layer(包含所有基于Spring webflow的web结构以及上面的所有配置文件。所以在开发过程中我们有几个属性文件分布在java/main/src在resource.properties.* 包下,我们在WEB-INF/conf 和WEB-INF/i18n 下的网络结构中有其他属性(它们是屏幕的标签消息)..所以我的问题如下:

    1. 将属性文件保留在 java/main/src 在稍后将在 classes 下的包下 webapp 中的文件夹?。
    2. 最好的方法是离开所有 一个地方的属性文件让我们说 WEB-INF/configurations ?要么 将业务层的一些属性文件放在一个地方,一些 其他地方的表示层的属性文件?
    3. 以最佳方式拥有此属性的最佳方法是 安装 webapp?,在 JAR 文件中提供属性,然后 将其包含在 WAR 或 EAR 中?这允许我们即时修改 并在不部署整个应用程序的情况下加入战争……或者哪种方法是最好的或常用的方法?

【问题讨论】:

  • 您使用的是 Maven 或 Ant 之类的构建工具吗?
  • 我们使用jenkins和ANT编译...

标签: java web-applications properties configuration


【解决方案1】:

我发现将属性分为两类很有帮助:

  1. 用于方便地更改应用程序外观和行为的属性
  2. 环境特定设置的属性(例如 DEV 与 PRODUCTION)

类别 #1 可以嵌入到您的 WAR 文件中任何有意义的地方。在WEB-INF/classes 是一个受欢迎的地方,但是把它们放在META-INF 的jar 文件中也可以很好地工作。选择你喜欢的标准并坚持下去是值得的。底线是这些文件在开发过程中被更改;它们在部署后不会更改,并且在系统发布时保持不变。

第 2 类应始终与可部署对象分开。理想情况下,特定于环境的属性应仅在它们发生更改时才部署。这实际上是他们所在的配置管理 (CM) 决策。开发人员需要提供这些配置文件的基本版本,CM 应该在将它们部署到特定环境(QA、PRE-PROD、PROD)时对其进行编辑。在强制委派职责的情况下(例如,在 SOX 应用的情况下),开发人员不应接触或看到属性文件的生产版本。我见过很多情况,这些文件的不同版本(DEV/QA/PROD)由开发人员维护并保存在源代码管理中,这是不合适的。

【讨论】:

  • 感谢查尔斯的评论!在类别 #2 中,我们使用单独的配置层为每个环境包含相同的属性,并使用 Jenkins 覆盖这些属性。当稍后发布的配置管理想要向客户交付和更改配置(属性文件)并且如果您将所有属性文件分布在不同的地方时,就会出现问题......所以如果我们有一个只有属性文件的单独配置项目应该在最佳实践下工作?你对那个查尔斯有什么经验?感谢您的建议
  • 啊。您还有第三类:由开发人员提供以在客户部署时设置的应用程序定制。我喜欢的方法是在可部署之外使用属性文件,但要确保任何可以设置的东西都有合理的默认值。如果文件不存在,或者未设置特定选项,则应用程序仍然有效。这很容易做到:有一个默认的内部属性文件。可以使用 JVM opts 中的系统属性设置外部文件的位置。这最大限度地减少了 CM 的影响。这有帮助吗?
  • 正是查尔斯,我们有一些属性可以配置让我们说 URL 后端(服务)、应用程序配置等),并且这些属性正在由 spring 属性实现调用......如果我理解正确你的方法是在可部署之外使用外部 JAR 或 WAR 并在应用程序中指向 JVM 选择恢复属性吗?...它会比 JVM 选择使用 JNDI 更好吗?你知道 JNDI 是否有效吗?谢谢
  • 非常接近。我只是在谈论一个简单的属性平面文件,而不是一个包装在 JAR 中的文件。这使得文件易于为客户管理。我猜想用 JNDI 查找文件是一种选择,但这似乎会使事情变得过于复杂。如果您可以从可用数据中确定目录,则可以指定一个特定目录并查看其中的所有.properties 文件。例如,如果你在 JBOSS 下运行,你可以使用System.getProperty("jboss.home"),然后在上面加上/properties 并查看那里。
【解决方案2】:

我认为拥有一个单独的源文件夹'resources'并将所有属性文件保存在那里是件好事。这些还可以确保属性文件不会混淆源代码。

【讨论】:

  • 感谢 Aditya ...所以您的意思是 src/main/java/resources 或 src/main/resources ?
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多