它是不好的做法,包括罐中的属性/ configuaration文件?(Is it bad pract

2019-07-31 03:31发布

例如:

MyApp的是一个Web应用程序,包含了应用程序,描述了配置数据的属性文件(server.properties)(例如服务器名称)。 在开发阶段,server.properties位于其自己的IDE项目文件夹(因为一个逻辑点)。

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

一个星期后......那MyApp的使用需要服务器配置数据的改变。 哪个更有意义?

A.修改server.properties文件早在IDE土地,并产生一个全新的jar文件。 重新部署。 (这意味着为弹跳简单的结构改变的应用程序)。

B.破解打开已经部署罐和修改server.properties文件? (可能需要调用MyApp的刷新功能,如果server.properties缓存...但不应该要求一个完整的应用程序的反弹。还需要记住修改源server.properties以及未来这样做展开时无法恢复server.properties旧的服务器名称)。

C.使server.properties外部摆在首位的jar文件。 非常类似于B的过程中,随着外部配置数据保持到罐的微小差别(引入的开发和生产部署之间不同的路径)

D.其他:

谢谢!

Answer 1:

我会跟去D.

尝试从外面的.jar加载属性文件,然后,如果失败,加载内置到罐子的属性。

这让你推了一个“现成的”配置与每个版本(也降低了部署的复杂性,如果只有一个文件),同时也使得压倒一切的配置可能和相当简单。



Answer 2:

如果您使用的春天,那么你可以使用属性占位做的工作。

<!-- 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会首先尝试和解决所有的属性从文件系统,然后退回到类路径中。 通过指定“忽略资源未找到”属性为“真”它会阻止从春季抛出一个异常,如果文件不存在于文件系统,并允许它来解决从classpath的属性来代替。

使用这种组合还可以让你的属性在两个文件分割,例如你可能永远都不想在classpath文件中指定的密码,并期望他们在外部文件系统上的指定。 任何从文件系统中缺少的属性会从classpath解决。

在包含文件夹:

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


Answer 3:

这取决于。 如果属性文件中包含旨在通过您的应用程序或库的用户修改,比它应该驻留之外的数据。

如果它包含的数据是静态的,你所创建的属性文件只是为了避免在源代码或者如果文件是本地化的字符串,我会离开他们在罐子里的编码值。 至少因为属性文件请人更改值;)



Answer 4:

D.

加载罐中的性能。 然后创建使用jar-ED性质为默认值新属性。 然后从罐外加载。 这使得性能的选择定制。



Answer 5:

请记住,在J2EE,你不能保证能够从J2EE环境(无直接文件访问)之外访问文件。

你将不得不使用JNDI指向一个数据源包含您的数据,或者一个属性在部署文物档案。

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



Answer 6:

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

其他值得注意的事情是,在生产中可能需要快速改变的属性,而无需预先包装罐或替代性的JAR文件。

例如数据库服务器正在下降,你需要指向不同的服务器(如果不使用数据库的负载平衡器)。 因此,所有你需要做的是更换数据库属性和重新启动。 您节省了大量的时间。



Answer 7:

经常它是代码应迁移UNCHANGED从测试到生产条件。 这意味着你不可以编辑嵌入configuation文件。 这常常是很麻烦 - 你也可以在你需要更改部署配置的情况下结束。 因此,我们离开罐外的configuraiton。

对于Java EE应用程序考虑JNDI或在classpath属性文件。

我在那里的配置是从邻居的Web应用程序retreived简单地将二者分开的Web应用程序。 这竟然是容易得多。



Answer 8:

我使用的webapps(WAR的)属性文件,但大多为默认值和物品,或多或少不变(因为web应用不应该更新自己的WAR,即使他们可以)。

对于像你说的是什么东西,不过,我使用JNDI。 您可以在web.xml文件中定义属性,如资源。 这样一来,在最坏的情况,你更新的web.xml,而不是应用程序本身。

对于一些服务器有没有在所有接触WAR覆盖这些资源价值的方法。 例如,在Tomcat的。

我通常做测试,Q / A和生产一个WAR和覆盖准确,这是环境敏感资源,使用Tomcat的Context XML文件。 我认为不必建立多个战争或修改战争,因为该应用程序,我测试的是几乎相同的生产应用程序更好这个有很多。



Answer 9:

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

  • 如果你不需要版本控制,然后用它覆盖属性文件的外部属性文件选项d是一个很好的一个。 选项B和C是东西起坐更开放,但如果你真的在乎你会使用版本控制:-)
  • 如果你需要的版本控制选项A为您提供了更多的控制权,但如果你有多个部署的可能性,您可能还需要/不需要进行版本控制的CONFIGS每个部署。 一个例子是独立的部署,以测试和生产平台。

下面是我们这个使用Maven模块和Maven WAR文件“覆盖”。

  1. 我们对Java代码组件多个模块。 这些都是JAR模块。
  2. 我们对静态内容“基本的web应用”模块,JSP和核心配置数据(春季布线,默认属性)。 这是一场战争模块,所以建筑的结果是包含上述所有+ JAR文件的战争。
  3. 每一个不同的“站点配置”是包含性,布线文件和内容特定于站点的覆盖一个WAR模块。 压倒一切的是使用的Maven WAR“叠加”机制所描述的,并导致新的WAR从“基地” WAR和覆盖被组装。

所有这一切都签入版本控制,而你需要做一个Maven构建和WAR部署进行配置更改。



Answer 10:

我问过类似的问题。 我们还没有想通这一切了呢。 但是,我们正在寻找到URL资源。 凡财产文件直接从SVN读取。 无需更新除了属性文件的任何其他。



Answer 11:

我开发使用Spring的J2EE应用程序。 我是围绕同样的问题相当长的一段时间运行,然后找到了解决办法。 我的问题是指定在属性数据库属性文件,我部署WAR文件之外。 我发现这个问题的解决是使用PropertyPlaceholderConfigurer和指定位置属性来定位系统的位置,因为这,

这是很简单,它的工作就好了!



文章来源: Is it bad practice to include properties/configuaration files within jars?