This project contains two sbt plugins that automatically configure your build to perform Load-time weaving (LTW) with Aspectj when running your applicaction. These plugins enable you to seamlessly run both regular applications and play projects in development mode and ensure that your aspects will always be woven as expected. Only 0.13.x versions of sbt are currently supported.
Add the aspectj-runner
plugin to project/plugins.sbt
, as well as our sbt-plugins repository. It should look like
this:
resolvers += Resolver.bintrayIvyRepo("kamon-io", "sbt-plugins")
addSbtPlugin("io.kamon" % "sbt-aspectj-runner" % "1.0.1")
Just run
!
Here is what the plugin will do depending on your fork
settings:
- fork in run := true: In this case, the forked process will run with the
-javaagent:<jarpath>
and that's all. - fork in run := false: Here we will load the application with a custom classloader called WeavingURLClassLoader that instantiates a weaver and weaves classes after loading, and before defining them in the JVM.
If try to run a Play application with LTW we will face some issues:
- Play has a
dynamic class-loading
mechanism that loads dependency classes differently from classes in your source code in order to be able to reload changes in dev mode; This breaks some Load-time Weaving Requirements. - Also, by design, Play can not fork, hence setting
javaOptions
has no effect.
Having said that, let’s get into the rabbit hole!.
In order to achieve LTW support in Play's dev run, we will use the same approach used in Activator Inspect
and sbt- echo
, taking heavily inspiration from the latter.
The basic idea is: configure a custom classloader, in our case it will be the WeavingURLClassLoader rather than a java agent, and Play run will be set up to use this custom classloader. The magic is here.
Add the aspectj-play-runner
plugin to project/plugins.sbt
. It should look like this:
resolvers += Resolver.bintrayIvyRepo("kamon-io", "sbt-plugins")
addSbtPlugin("io.kamon" % "sbt-aspectj-play-runner" % "1.0.1")
This plugin has been tested with Play 2.4.8 and Play 2.5.10.
Just execute run
on the SBT console, everything should already be in place for you.
##Examples
There are full runnable examples.