例如:

MyApp是一个网络应用程序包含一个性文件(文件服务器。性)介绍了配置的数据(例如服务器名称)的应用程序。在开发阶段,服务器。性是位于其自己的IDE项目文件夹(a逻辑地点)。

现在是时候部署MyApp。IDE使得相当琐碎的瓶子了类文件,以及支持配置文件。现在我们只是下降的罐子在适当的网络的容器,我们就走了。...

一周后...该服务器的配置数据,MyApp使用需要改变。这使得更有意义?

A.修改的服务器。性文件回IDE土地和产生一个完全新的罐子文件。重新部署。(这意味着弹的应用程序的一个简单的结构变化)。

B。裂开的已经部署的罐子和修改的服务器。性文件?(可能需要调用一个刷新的功能在MyApp如果服务器。性能是缓存...但应该不需要一个完整的应用程序的反弹。还需要记住要修改源服务器。性能,以及使将来的部署不恢复服务器。性旧服务器名称)。

C.让服务器。性外的罐子文件放在第一位。非常类似于B的过程中,有轻微的差别保持config数据外部的罐子里(介绍了不同的路径之间的发展和生产部署)

D.其他:

谢谢!

有帮助吗?

解决方案

我和D一起去。

尝试从.jar外部加载属性文件,如果失败,则加载内置于jar中的属性。

这可以让你推出一个“现成的”产品。每个构建的配置(如果只有一个文件,也可以降低部署的复杂性),同时还可以使覆盖配置成为可能并且相当简单。

其他提示

如果您使用Spring,那么您可以使用属性占位符来完成工作。

<!-- try and resolve the config from the filesystem first and then fallback to the classpath -->
<context:property-placeholder location="file:config.properties, classpath:config.properties"
                              ignore-resource-not-found="true"/>

您可以在文件系统和类路径上指定资源,Spring将首先尝试解析文件系统中的所有属性,然后回退到类路径。通过指定“ignore-resource-not-found”&quot;属性为“true”如果文件系统中不存在该文件并允许它从类路径中解析属性,它将阻止Spring抛出异常。

使用此组合还允许您将属性拆分为两个文件,例如,您可能永远不希望在类路径上的文件中指定密码,并期望在文件系统上从外部指定密码。文件系统中缺少的任何属性都将从类路径中解析。

在包含以下内容的文件夹中

application.jar
config.properties

你应该可以使用:

java -jar application.jar

这是一个示例config.properties供参考:

# This file contains properties that are used to configure the application
database.url=127.0.0.1
database.port=3306
database.user=root
database.pass=p4ssw0rd

这取决于。如果属性文件包含要由应用程序或库的用户更改的数据,那么它应该位于外部。

如果它包含静态数据并且您创建属性文件只是为了避免编码源代码中的值,或者如果文件是本地化字符串,我会将它们留在jar中。至少因为属性文件邀请人们改变值;)

d

在jar中加载属性。然后使用jar-ed属性作为默认值创建一个新属性。然后从罐子外面装载。这允许选择属性的自定义。

请记住,在J2EE中,您无法保证能够从J2EE环境外部访问文件(无法直接访问文件)。

您必须使用JNDI指向包含数据的数据源或部署工件中的属性文件。

例如,Websphere默认情况下不允许直接文件访问。

选项D.在不同的环境中,您可能需要指定想要指定环境属性,例如连接到数据库或代理等。

其他值得注意的事情是,在生产中,您可能希望快速更改属性,而无需预先打包jar或替换jar中的属性文件。

E.g。数据库服务器已经崩溃,您需要指向不同的服务器(如果不使用数据库的负载平衡器)。所以你需要做的就是替换数据库属性并重新启动。你在那里节省了很多时间。

通常,这是一个标准,代码应该从测试迁移到生产 UNCHANGED 。这意味着您可能无法编辑嵌入的配置文件。此外,您可能会在需要更改已部署配置的情况下结束 - 这通常非常麻烦。因此,我们将configuraiton留在罐子外面。

对于Java EE应用程序,请考虑JNDI或类路径中的属性文件。

我有一个Web应用程序,其中从邻居Web应用程序中检索配置只是为了将两者分开。事实证明这更容易。

我在webapps(WARs)中使用属性文件,但主要用于默认值以及或多或少不可变的内容(因为即使可能,webapps也不应该更新它们的WAR)。

对于你所说的内容,我使用JNDI。您可以在web.xml文件中将属性定义为资源。这样,在最坏的情况下,您更新web.xml而不是应用程序本身。

对于某些服务器,有一些方法可以覆盖这些资源值,而根本不会触及WAR。例如,在Tomcat中。

我通常会为测试,Q / A和生产制作一个WAR,并使用Tomcat的Context xml文件覆盖环境敏感资源。我认为这比必须构建多个WAR或修改WARS要好得多,因为我正在测试的应用程序几乎与正在生产的应用程序相同。

我认为,答案取决于你是否认为你需要的版本控制的配置.(他们可以生产的配置或配置,为进行回归测试...)

  • 如果你不需要的版本控制,那么选项D与外部财产的文件,该文件将复盖一个酒店的文件是一个很好的一个。选项B和C的更开放的东西-ups,但是如果你真的关心你就会被使用的版本控制:-)
  • 如果你需要的版本控制,选择一个给你更多的控制,但是如果你有可能的多个部署的你可能还需要/需要的版本控制的配置为每个部署。一个例子是单独部署到测试和生产平台。

这里是我们如何做到这家使用模块和专家的战争文件"重叠".

  1. 我们有多个模块代码组成。这些罐子模块。
  2. 我们有"基地网络应用程序"模块,用于静态的内容,Jsp和核心结构的数据(春天线,默认的性质)。这是一场战争模块,因此结果的建立是一个战争,其中包含上述所有罐子文件。
  3. 每个不同的"站点配置"是一个战争模块,其中包含网站的特定替代性的,接线文件和内容。压倒一切的描述使用专家的战争"重叠"机构,并且导致新的战争正在装配从"基地"战争和复盖。

所有这一切都是检查到版本控制,并且你需要做的一家建立和战争的部署要进行配置的变化。

我问了一个类似的问题。我们还没有想到这一切。但我们正在研究URL资源。其中属性文件直接从SVN读取。除了属性文件之外,不需要更新任何内容。

我使用Spring开发J2EE应用程序。我在很长一段时间内遇到了同样的问题然后找到了解决方案。  我的问题是在我部署的war文件之外的属性文件中指定数据库属性。我发现的解决方案是使用PropertyPlaceholderConfigurer并指定location属性来定位您的系统位置,

<强>     

这很简单,工作得很好!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top