现在,我的团队处理大约4-5个不同的服务器和大约2-3个不同的DB服务器,我们使用环境变量来决定我们在哪个服务器上,以及使用什么服务器配置。
随着我的团队不断扩大,有没有更好的方法来做到这一点?我考虑过编译器标志/ args,但它看起来并不健壮。
发布于 2012-09-07 03:42:58
在我看来,在java中,基本上有3种方法可以破解这个cookie:
您已经发现了环境变量,这几乎是“unix方式”,以获得您想要的效果;不同于普通二进制文件的配置,它为正在运行的应用程序在其上执行的环境定制。
系统属性实际上是环境变量的Java“道德等价物”。它们是通过应用程序命令行上的-D参数传入的,例如...
java -Dlogback.configurationFile=/opt/dm/logback.xml -cp app.jar org.rekdev.AppJava中的显式属性文件处理http://docs.oracle.com/javase/tutorial/essential/environment/properties.html是第三种变体,您经常可以看到它与-D结合使用,以获得类似于默认行为的东西,这些行为可以在运行时从命令行覆盖。这就是上面的logback.xml配置的基本情况,JAR文件中有一个logback.xml,它将被使用,除非存在一个名为"logback.configurationFile“的系统属性,这时应用程序将加载它。
当您试图弄清楚如何在多服务器环境中保持这一切同步并正常工作时,请考虑使用chef http://wiki.opscode.com/display/chef/Home进行部署,并将每个特定环境的自定义置于chef的控制之下。把厨师的“菜谱”放在版本控制中,然后,瞧,完全放在配置管理上。
把它运过来!
发布于 2012-09-07 03:43:08
我可以看到两种情况
在包中嵌入所有不同的属性(可以是war、ear、jar,或者在文件系统/yourapp/etc/)
时创建的
假设您的应用程序名为foo
解决方案1
它的优点是,您的应用程序可以在任何受支持的服务器上按原样放置(所有这些服务器在您的应用程序包中都有一个属性文件)。您的属性将命名为foo.dev.properties、foo.test.properties、foo.prod.properties、foo.damien.properties、foo.bob.properties。
另一个好处是,每个开发人员都有自己的开发文件,他可以安全地推送svn/git/任何文件,并确保其他开发人员不会破坏他的配置。
在运行时,应用程序可以检查-D参数,甚至可以自动检索主机名,以便加载正确的属性文件。
解决方案2
它的优点是你的包不会被不必要的属性文件污染。
为了构建特定的环境,您必须配置大量的ant任务/maven目标。您的源目录中也将包含环境的属性文件,但只有一个属性文件将随应用程序一起提供。这个foo.properties将只有值的占位符,并且将使用foo.ENV.properties和正确的ant task/maven目标在其中推断值。
在我的实际工作和之前的工作中,我们确实使用了解决方案1,我认为它带来了灵活性。一些参数(如数据库用户/密码)是直接从Unix服务器上的环境变量获取的(因此只有服务器管理员知道凭据)。
您可以安全地混合解决方案,以便获得您和您的团队有更多灵活性的地方。
https://stackoverflow.com/questions/12306946
复制相似问题