Update: You can now set the run mode easy and conveniently using our sbt-runmode plugin for SBT.
Setting the run.mode
in Lift applications is the source of a surprising number of questions. The documentation recommends passing it as a parameter when the JVM is invoked. This can be hard to achieve for various reasons. In our case our deployment is automated using Chef, and scripts to start and stop the Jetty web server are installed by the package manager. We don’t really want to monkey around with these scripts, so we had to find another way. Jetty is written in Java, which means it must have a ridiculously complex XML configuration language. The Jetty developers turned it up to 11 by making their configuration language Turing complete, so we can actually set the system properties in a configuration file. The file we want to create isWEB-INF/jetty-web.xml
and we want it to contain this:
If we leave this around then our application will always run in production mode. We don’t want this when we’re developing as we won’t, for instance, get stack traces printed to the browser. Thus we should copy this file in when we package up the project, and remove it when the packaging step completes. Assuming you’re using SBT, store the above text in project/jetty-web.xml
and add the following to your SBT project file to get this functionality:
This is pretty simple code. Basically it redefines the package
action to first copy in the jetty-web.xml
file, then it runs the original package action, and finally it deletes the jetty-web.xml
. Now any WAR
files you run under Jetty will automatically be in production mode, but callingsbt jetty-run
will still give you development mode.