配置取决于启动模式

Rea*_*onk 12 java scala playframework-2.4

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

Mon*_*ari 17

我通常有一个基本配置(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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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))));
    }
}
Run Code Online (Sandbox Code Playgroud)

别忘了包括play.application.loader = "modules.CustomApplicationLoader"你的application.conf.

在较低版本中,Play类似的东西可以通过使用GlobalSettings类和重写来实现onLoadConfig.心灵GlobalSettingsPlay 2.4被贬低.

如果你不喜欢,包括test.conftest mocksTestModule你的生产版本,你可以filter在使用文件SBT.

  • 当我在Scala中遵循上面的方法时,我得到一个`ConfigurationException:Guice配置错误:1)play.api.Application没有实现绑定.我错过了什么吗? (3认同)