Déployer JSF 2.0 HelloWorld sur Glassfish v3 avec ANT

Glassfish 3 offre un module d’extension pour exécuter des opérations asadmin avec ANT. Dans cet article, vous trouverez :

  • Un exemple d’application web JSF 2.0 construit avec ANT
  • Le paramétrage du module d’extension ANT avec Glassfish pour déployer cette application

Etapes préalables

Pour cet exemple, vous devrez avoir installé les composants suivants :

  • Glassfish Server Open Source Edition 3.0.1; vous pouvez télécharger la distribution à l’URL suivante
  • La dernière version de Apache Ant ; vous pouvez télécharger la distribution à l’URL suivante
  • L’implémentation de référence de JSF 2.0 (aka le projet Mojarra)
  • glassfish-ant-tasks ; Pour ce dernier composant, lancez l’outil updatetool qui vient avec glassfish et ajouter l’add-on correspondant

Créez le projet HelloWorld/JSF

Le projet HelloWorld/JSF extrait du Tutorial Java EE 6 contient les 3 fichiers suivants stockés dans une arborescence créé pour l’occasion :

src 
-> WEB-INF -> web.xml
-> java -> Hello.java
-> xhtml -> hello.xhtml

web.xml contient la configuration de la servlet JavaServer Faces et de l’application web :

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>JSF HelloWorld</display-name>
<description>JSF HelloWorld Application</description>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>faces/hello.xhtml</welcome-file>
</welcome-file-list>
</web-app>

Hello.java contient un ManagedBean qui affiche « Hello World » :

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Hello {
final String world = "Hello World!";

public String getWorld() {
return world;
}
}

Enfin hello.xhtml est un fichier Facelets qui affiche le contenu du Managed Bean via « Expression Language » :

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8"/>
<title>JavaServer Faces Hello World Application</title>
</head>
<body>
#{hello.world}
</body>
</html>

Script ANT et fichier .war

Positionnez la variable d’environnement JSF_HOME qui correspondra au répertoire du projet Mojarra. Créez ensuite le fichier build.xml à la racine du projet (au dessus du répertoire src :

<?xml version="1.0" encoding="UTF-8"?>
<project>
<!-- Change the properties below to fit to your project context -->
<property name="app.name" value="project2"/>

<!-- Make sure the ENVIRONMENT variables are set correctly -->
<property environment="env"/>
<property name="jsf.home" value="${env.JSF_HOME}"/>

<property name="src.dir" value="src"/>

<target name="compile">
<mkdir dir="build/classes"/>
<javac srcdir="src/java" destdir="build/classes">
<classpath>
<pathelement location="${jsf.home}/lib/jsf-api.jar"/>
<pathelement location="${jsf.home}/lib/jsf-impl.jar"/>
</classpath>
</javac>
</target>

<target name="war" depends="compile">
<mkdir dir="build/war"/>
<war destfile="build/war/${app.name}.war"
webxml="src/WEB-INF/web.xml">
<fileset dir="src/xhtml"/>
<classes dir="build/classes"/>
</war>
</target>
</project>

Vous pourrez construire le fichier .war avec la commande ci-dessous :

ant war

Script ANT et déploiement Glassfish

La documentation produit « Chapter 3 Using Ant with GlassFishTM Server » présente plusieurs des concepts relatifs à l’utilisation de ANT avec ASADMIN. Malheureusement, le document contient également de nombreuses erreurs, à commencer par le nom du fichier .jar correspondant à l’extension ANT pour Glassfish inclus dans $GLASSHFISH_HOME/lib/ant/ant-tasks.jar. Pour utiliser cette extension; procédez comme suit :

Modifier GLASSFISH_HOME, CLASSPATH et ANT_OPTS

Positionnez les variables GLASSFISH_HOME mais également ANT_OPTS et CLASSPATH avant de lancer la commande ant comme ci-dessous :

export ANT_OPTS="-Djava.library.path=$GLASSFISH_HOME/lib/ant"
export CLASSPATH=$CLASSPATH:$GLASSFISH_HOME/lib/ant/ant-tasks.jar

Créer un fichier glassfish.txt

Il faut créer un fichier glassfish.txt qui contiendra le mot de passe de l’utilisateur admin de glassfish pour permettre le déploiement :

echo AS_ADMIN_PASSWORD=adminadmin > /tmp/glassfish.txt

Modifier build.xml pour inclure les directives de déploiement

Là encore, les informations et notamment les noms des classes sont imprécis. Voici un fichier qui fonctionne avec la version 3.0.1 :

<?xml version="1.0" encoding="UTF-8"?>
<project>
<!-- Change the properties below to fit to your project context -->
<property name="app.name" value="project2"/>

<!-- Make sure the ENVIRONMENT variables are set correctly -->
<property environment="env"/>
<property name="asinstalldir" value="${env.GLASSFISH_HOME}"/>
<property name="jsf.home" value="${env.JSF_HOME}"/>

<property name="src.dir" value="src"/>

<target name="as-ant-init">
<taskdef name="sun-appserv-deploy"
classname="org.glassfish.ant.tasks.DeployTask" />
<taskdef name="sun-appserv-undeploy"
classname="org.glassfish.ant.tasks.UndeployTask" />
</target>

<target name="compile">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes">
<classpath>
<pathelement location="${jsf.home}/lib/jsf-api.jar"/>
<pathelement location="${jsf.home}/lib/jsf-impl.jar"/>
</classpath>
</javac>
</target>

<target name="war" depends="compile">
<mkdir dir="build/war"/>
<war destfile="build/war/${app.name}.war"
webxml="src/WEB-INF/web.xml">
<fileset dir="src/xhtml"/>
<classes dir="build/classes"/>
</war>
</target>

<target name="deploy" depends="as-ant-init, war"
description="Install Application to Servlet Container">
<echo message="Application Name: ${app.name}"/>
<sun-appserv-deploy passwordfile="/tmp/glassfish.txt"
host="localhost"
installDir="${asinstalldir}">
<component file="build/war/${app.name}.war"
contextroot="${app.name}"/>
</sun-appserv-deploy>
</target>

<target name="undeploy" depends="as-ant-init"
description="Install Application to Servlet Container">
<echo message="Application Name: ${app.name}"/>
<sun-appserv-undeploy name="${app.name}"
passwordfile="/tmp/glassfish.txt"
host="localhost"
installDir="${asinstalldir}">
</sun-appserv-undeploy>
</target>

</project>

Déployer et Desinstaller l’application

Ant vous permet désormais de déployer et désinstaller l’application à l’aide du script ci-dessous :

ant deploy

Pour désinstaller l’application, lancez :

ant undeploy