配置取决于启动模式
可以在开发模式(通过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.conf
和TestModule
中的模拟 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=) "); }
对于每种模式,创建一个文件夹(名称与环境相同)并在该文件夹中保留特定于环境的配置。