JRebel for a Gradle Spring Boot App
There is some documentation on how to add JRebel to a Spring Boot app that uses Gradle as the build tool. It is basic but works fine.
All you have to do is to add a few lines to build.gradle:
if (project.hasProperty('rebelAgent')) { bootRun.jvmArgs += rebelAgent }
Then set the property in gradle.properties:
rebelAgent=-agentpath:[path/to/JRebel library]
However there are several ways to improve on this.
Make JRebel Optional
For instance, what if you don’t always want JRebel everytime you start the app with ‘bootRun’? JRebel plugins for IDE’s like Intellij IDEA are smart enough to give you the option of running your app with or without JRebel
There would be several ways of doing this, but one would be to add the JRebel startup configuration in an optional task.
task addRebelAgent << { if (project.hasProperty('rebelAgent')) { bootRun.jvmArgs += rebelAgent } else println 'rebelAgent property not found' } task rebelRun(dependsOn: ['addRebelAgent', 'bootRun'])
Now running ‘bootRun’ would start the app normally, and if you want JRebel then use the ‘rebelRun’ task instead. I have also added a debug message if the ‘rebelAgent’ property is not available.
Another way would be to pass an optional property to the ‘bootRun’ task to use as a flag whether to add JRebel or not.
if (project.hasProperty('rebelAgent') && project.hasProperty('addJRebel')) { bootRun.jvmArgs += rebelAgent }
Then to use JRebel you just need to add the extra property.
gradle bootRun -PaddJRebel=true
Finding the Rebel Base
Putting the path to the JRebel library to use as the agent in a properties file allows multiple developers to have their own version. However the path is still hard-coded, which is something that should be avoided if possible.
Another way to specify the path is to use a system environment variable to point to where JRebel is installed. JetBrains recommends using REBEL_BASE. Once set up, that allows you to use the environment variable in multiple ways, e.g. Gradle build files, command line, build scripts, etc.
Here is an example using the additional ‘addRebelAgent’ task that I specified earlier, that I use on my Windows 64 machine.
task addRebelAgent << { project.ext { rebelAgent = "-agentpath:${System.env.REBEL_BASE}${rebelLibPath}" } if (project.hasProperty('rebelAgent')) { bootRun.jvmArgs += rebelAgent } else println 'rebelAgent property not found' } task rebelRun(dependsOn: ['addRebelAgent', 'bootRun'])
And in gradle.properties I have specified the path to the agent library from the JRebel installation location.
rebelLibPath=\\lib\\jrebel64.dll
All I’ve done here is to build the path in the ‘rebelAgent’ property from the REBEL_BASE environment variable and another property specifying the internal path to the library.
rebelAgent = "-agentpath:${System.env.REBEL_BASE}${rebelLibPath}"
Published on Java Code Geeks with permission by David Wong, partner at our JCG program. See the original article here: JRebel for a Gradle Spring Boot App Opinions expressed by Java Code Geeks contributors are their own. |