How to live reload your WildFly applications

The next major release of WildFly Bootable JAR (3.0.0) is going to bring a super interesting feature. You can use a Maven goal to achieve live reload of your applications. Let’s check it out.

In order to use the live reload feature, you have to use the version 3 of the WildFly Bootable Jar plugin:

 <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
      <plugin>
        <groupId>org.wildfly.plugins</groupId>
        <artifactId>wildfly-jar-maven-plugin</artifactId>
        <version>3.0.0.Beta1</version>
        <configuration>
          <feature-pack-location>wildfly@maven(org.jboss.universe:community-universe)#${version.server.bom}</feature-pack-location>
          <layers>
            <layer>jaxrs</layer>
            <layer>management</layer>
          </layers>
          <excluded-layers>
            <layer>deployment-scanner</layer>
          </excluded-layers>
            <plugin-options>
                <jboss-fork-embedded>true</jboss-fork-embedded>
            </plugin-options>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>package</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

By updating to the new plugin version, you can use the new “dev-watch” goal, which is supposed to build, deploy and watch for changes in your application.

Let’s try it with a simple REST Service:

@Path("/")
public class SimpleRESTService {

	@GET
	public String hello()
	{
		return "Hello from Bootable JAR!\n ";
	}

}

Now build and run your application with:

$ mvn wildfly-jar:dev-watch

Check the application endpoint:

$ curl http://localhost:8080/rest
Hello from Bootable JAR!

Now edit the Endpoint so that t returns a different String:

	@GET
	public String hello()
	{
		return "Hello from Bootable JAR changed!\n ";
	}

As you save the file, you will see that the application is automatically re-deployed:

14:42:35,200 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 18) WFLYUT0022: Unregistered web context: '/' from server 'default-server'
14:42:35,206 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0028: Stopped deployment ROOT.war (runtime-name: ROOT.war) in 7ms
14:42:35,228 INFO  [org.jboss.as.server] (management-handler-thread - 4) WFLYSRV0009: Undeployed "ROOT.war" (runtime-name: "ROOT.war")
14:42:35,239 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0027: Starting deployment of "ROOT.war" (runtime-name: "ROOT.war")
14:42:35,345 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 18) RESTEASY002225: Deploying javax.ws.rs.core.Application: class com.mastertheboss.jaxrs.activator.JaxRsActivator
14:42:35,347 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 18) WFLYUT0021: Registered web context: '/' for server 'default-server'
14:42:35,352 INFO  [org.jboss.as.server] (management-handler-thread - 4) WFLYSRV0010: Deployed "ROOT.war" (runtime-name : "ROOT.war")

Check again the application endpoint:

$ curl http://localhost:8080/rest
Hello from Bootable JAR changed!

As you can see, we managed to reload our application without any manual re-deployment. Pretty neat isn’t it?

You can check the source code of this example here: https://github.com/fmarchioni/mastertheboss/tree/master/bootable-jar/dev-watch