Retour sur Devoxx 2016 : WildFly Swarm

Cette année Devoxx France s’est tenu pendant 3 jours du 20 au 22 avril au Palais des Congrès de Paris. Infotel a permis à de nombreux collaborateurs de participer à cette éventement.

Frédéric JOSEPH nous fait un retour sur WildFly Swarm


WildFly Swarm – A quoi ça sert ?

WildFly, anciennement JBoss Application Server, est un serveur d’application Java EE 7 de la société Red Hat.


WildFly Swarm est un projet se basant sur WildFly 9 et offrant une approche innovante pour le packaging d’applications Java EE en incluant le code applicatif et les dépendances du serveur au sein d’un unique jar exécutable (fat-jar ou uberjar).

Serveur d’applications monolithique vs « uberjar »

Lors de l’utilisation d’un serveur d’applications monolithique, il faut préalablement installer le serveur puis déployer l’application dessus.

Ce serveur fournit généralement bien plus de fonctionnalités (EJB, JMS, JSF…​) que celles exploitées par l’application Java EE.

Dans un uberjar « WildFly Swarm », seules les composantes de WildFly AS (on parle de « fraction ») nécessaires à l’application sont embarquées dans le jar.
On obtient ainsi un serveur d’applications personnalisé plus léger et démarrant plus rapidement qu’un serveur Java EE « classique ».

De part son fonctionnement, WildFly Swarm incite les développeurs à découper une application Java EE en plusieurs modules distincts et autonomes, afin de ne pas embarquer toute la stack Java EE dans un unique fichier jar (qui serait très volumineux).


Chacun des modules peut alors être un micro-service à part entière pouvant être remplacé, mis à jour ou déployé sur de nouvelles machines de manière indépendante des autres modules.


Du fait qu’une application soit constituée d’un unique jar exécutable, il devient également très facile d’automatiser son déploiement en l’intégrant par exemple au sein d’un conteneur docker (plugin Maven docker-maven-plugin).

Mise en oeuvre

L’utilisation de WildFly Swarm est vraiment très simple avec Maven.

Pré-requis

Les versions minimales pour exploiter WildFly Swarm sont :

  • JDK 8

  • Maven 3.2.5

Modification du POM

  • Package
    <packaging>jar</packaging>

    Il devient inutile de réaliser le package de l’application sous la forme d’un war.

    Toutefois, cela reste possible et l’on obtiendra une archive war valide qui sera encapsulée dans le uberjar à la place du jar.


  • Plugin Maven

    Ajout du plugin Maven

    <plugin>
        <groupId>org.wildfly.swarm</groupId>
        <artifactId>wildfly-swarm-plugin</artifactId>
        <version>${version.wildfly-swarm}</version>
        <configuration>
          <mainClass>com.example.rest.Main</mainClass>
          <properties>
            <swarm.http.port>8080</swarm.http.port> <!-- Already the default value -->
            <swarm.context.path>/</swarm.context.path> <!-- Already the default value -->
          </properties>
          <jvmArguments>
            <jvmArgument>-Xmx128m</jvmArgument>
          </jvmArguments>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>create</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
  • Dépendances

    Ajout des fractions du serveur d’applications dont l’application à besoin.

    Exemple pour JAX-RS

    <!-- Java EE 7 dependency -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- Wildfly Swarm Fractions -->
    <dependency>
      <groupId>org.wildfly.swarm</groupId>
      <artifactId>jaxrs</artifactId>
    </dependency>

Code de l’application

@Path("/hello")
public class HelloWorldEndpoint {
 
  @GET
  @Produces("text/plain")
  public Response doGet() {
    return Response.ok("Hello from WildFly Swarm!").build();
  }
}


@ApplicationPath("/rest")
public class RestApplication extends Application {
}


public class Main {
 
    public static void main(String[] args) throws Exception {
 
        Container container = new Container();
 
        JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class, "my-app.war");
        deployment.addClass(RestApplication.class);
        deployment.addClass(HelloWorldEndpoint.class);
        deployment.addAllDependencies();
        container.start().deploy(deployment);
    }
}


La classe Main sert à configurer le conteneur Java EE et à déployer les ressources programmatiquement (facultatif si on package en war).

Génération/Exécution de l’application

La génération de l’archive s’effectue de manière classique.

mvn package

Le dossier target contient alors le jar de l’application ainsi qu’une archive *-swarm.jar

Si on ouvre cette archive jar, on trouve principalement :

  • un répertoire m2repo contenant l’ensemble des librairies nécessaires à l’application

  • un répertoire _bootstrap contenant le jar de l’application

  • un répertoire META-INF contenant les fichiers de configuration nécessaires au uberjar dont notamment :

    • wildfly-swarm.properties : propriétés définies par l’utilisateur (ou par défaut)

      #Generated by WildFly Swarm
      #Sun May 08 14:52:08 CEST 2016
      swarm.bundled.dependencies=true
      swarm.context.path=/
      swarm.http.port=8080
      swarm.app.artifact=hello-swarm-infotel.jar
    • MANIFEST.MF : fichier Manifest standard indiquant la classe Main de bootstrap (Main-Class), ainsi que la classe Main de l’application (Wildfly-Swarm-Main-Class).

      Manifest-Version: 1.0
      Main-Class: org.wildfly.swarm.bootstrap.Main
      WildFly-Swarm-Main-Class: com.example.rest.Main

      Les autres fichiers de configurations servent à lister les dépendances de l’application et des modules WildFly Swarm.

Le lancement de l’application s’effectue à l’aide de la commande java -jar *-warm.jar ou avec la commande maven

mvn wildfly-swarm:run

L’application est alors opérationelle comme une application déployée sur un serveur Java EE « classique ».

Et voici comment réaliser un micro-service, exposant un Web Service REST, sous la forme d’un uberjar contenant un serveur Java EE personnalisé et dont la taille est seulement de 38.6 Mo.


Pour aller plus loin

Les possibilités de WildFly Swarm vont bien au-delà des limites de cet article (security, monitoring, message JMS…​).


Quelques liens utiles :