An online novel about the Source, the Force, the real life and everything in between...

Incremental Development With Scala and JRebel

Apr 26th, 2011

One of the things I love most about Lisp development is the ability to
develop applications in an incremental interactive manner – you write
one function, compile it, load into your current REPL session, make
some adjustments and repeat this process until you get satisfactory
results. You never stop to compile your project, you never have to
restart your application server. Without those distractions it’s
easier to maintain your concentration and to remain in the flow.

With languages like Scala and Java, however, you cannot do this – at
least without a bit of external help. This help comes in the form of an
application called JRebel, which basically reloads the classes in your
program as you make changes to them and recompile them. JRebel is a commercial
application and generally you have to pay to use it… unless you want
to you use it for Scala development, that is. ZeroTurnaround(the
company that makes JRebel) offers
free licences to Scala developers
and if you’re one of them you should definitely get one.

Installing JRebel is trivial – generally you have to only extract a
zip file(or use an installer) somewhere and drop in the JRebel folder
the licence file that they have e-mail you. Afterwards you simply have
to integrate JRebel with your build system. JRebel can also be
integrated with IDEs, but I want cover this here. I use mostly
Maven 3 and
SBT so I’ll show you
what to do for them. With Maven you have to add the following to the
$MAVEN_OPTS environmental variable:

Since most people use JRebel for web development to avoid the need to
restart their application containers and Scala’s most prominent
framework is Lift you’d probably want to enable
the JRebel Lift plug-in as well:

Stick this in your shell’s init file and source it to make it
available in the shell.

Now when you start your web app with

1

mvn jetty:run

And the continuous Scala compilation with

1

mvn scala:cc

The compiler with pickup the changes you made and JRebel will reload
the changed classes behind the scenes. The development process this
way starts to feel a bit like using a scripting language such as Ruby
or PHP.

If you’re using SBT you should modify the sbt startup script to
include the same options that I mentioned in the section about Maven
configuration. Mine sbt script looks like this: