配置取决于启动模式

可以在开发模式(通过run ),生产模式(通过start )或测试模式下start播放。 有没有办法提供不同的配置文件( conf/application.conf ),具体取决于它在哪个模式下启动?

我通常有一个基本配置( application.conf )和每个环境三个额外的配置。 在Play Framework 2.4 ,可以通过扩展GuiceApplicationLoader并将基础conf与您的特定于环境的conf合并来完成。 您可以前进一步,为每个环境提供不同的guice模块。

Scala版本:

 class CustomApplicationLoader extends GuiceApplicationLoader { override protected def builder(context: Context): GuiceApplicationBuilder = { val builder = initialBuilder.in(context.environment).overrides(overrides(context): _*) context.environment.mode match { case Prod => // start mode val prodConf = Configuration(ConfigFactory.load("prod.conf")) builder.loadConfig(prodConf ++ context.initialConfiguration).bindings(new ProdModule()); case Dev => // run mode val devConf = Configuration(ConfigFactory.load("dev.conf")) builder.loadConfig(devConf ++ context.initialConfiguration).bindings(new DevModule()); case Test => // test mode val testConf = Configuration(ConfigFactory.load("test.conf")) builder.loadConfig(testConf ++ context.initialConfiguration).bindings(new TestModule()); } } } 

Java版本:

 public class CustomApplicationLoader extends GuiceApplicationLoader { @Override public GuiceApplicationBuilder builder(ApplicationLoader.Context context) { final Environment environment = context.environment(); GuiceApplicationBuilder builder = initialBuilder.in(environment); Configuration config = context.initialConfiguration(); if (environment.isTest()) { config = merge("test.conf", config); builder = builder.bindings(new TestModule()); } else if (environment.isDev()) { config = merge("dev.conf", config); builder = builder.bindings(new DevModule()); } else if (environment.isProd()) { config = merge("prod.conf", config); builder = builder.bindings(new DevModule()); } else { throw new IllegalStateException("No such mode."); } return builder.in(environment).loadConfig(config); } private Configuration merge(String configName, Configuration currentConfig) { return new Configuration(currentConfig.getWrappedConfiguration().$plus$plus(new play.api.Configuration(ConfigFactory.load(configName)))); } } 

不要忘记将play.application.loader = "modules.CustomApplicationLoader"到您的application.conf

Play较低版本中,可以通过使用GlobalSettings类并覆盖onLoadConfig来实现类似的function。 Play 2.4 Mind GlobalSettings被删除。

如果您不喜欢将test.confTestModule中的模拟 test mocks包含到生成版本中,则可以使用sbt filter文件。

您可以使用播放给您的3种方式之一设置不同的配置文件:

1 – 使用-Dconfig.resource

它将在应用程序类路径中搜索备用配置文件(通常在打包之前将这些备用配置文件提供到应用程序conf /目录中)。 播放将调查conf /所以你不必添加conf /。

$ / path / to / bin / -Dconfig.resource = prod.conf

2 – 使用-Dconfig.file

您还可以指定未打包到应用程序工件中的另一个本地配置文件:

$ / path / to / bin / -Dconfig.file = / opt / conf / prod.conf

3 – 使用-Dconfig.url

您还可以指定要从任何URL加载的配置文件:

$ / path / to / bin / -Dconfig.url = http://conf.mycompany.com/conf/prod.conf

结帐更多:

https://www.playframework.com/documentation/2.3.x/ProductionConfiguration

这可以通过基于可以通过-Dmode=staging/dev/prod提供的环境加载配置文件,以及加载我在Global.java中覆盖GlobalSettings的LoadConfig的文件来完成。

Java代码段 –

  @Override public Configuration onLoadConfig(Configuration config, File file,ClassLoader classLoader) { Configuration updatedConfig = config; String mode = config.getString("mode"); if (StringUtils.isNotEmpty(mode)) { try { File modeFolder = FileUtils.getFile(file, "conf/" + mode); if (modeFolder.exists()) { play.api.Configuration modeConfig = config.getWrappedConfiguration(); IOFileFilter fileFilter = new WildcardFileFilter("*.conf"); Collection fileList = FileUtils.listFiles(modeFolder, fileFilter, null); for (File confFile : fileList) { modeConfig = modeConfig .$plus$plus(new play.api.Configuration(ConfigFactory.parseFile(confFile))); } updatedConfig = new Configuration(modeConfig); } } catch (Exception e) { Logger.error("Exception while loading configuration for mode : " + mode, e); } } else { Logger.error("Please provide mode in which play application has to start (Ex. play -Dmode=) "); } 

对于每种模式,创建一个文件夹(名称与环境相同)并在该文件夹中保留特定于环境的配置。