JavaFX Course

Posted in Java/J2EE on août 26th, 2009 by Ajrarn

…connaissez-vous les courses online de Sang Shin?
Si non, sachez que Sang Shin est ce qu’on appelle un évangéliste chez Sun et que l’une de ses activités est de proposer des “courses” online sur les technologies du moment, comme Java, J2EE, Ajax, les Web services, Ruby ou… JavaFX.
Pour ceux qui ne connaissent pas, JavaFX est une solution RIA concurrente de Flex et de Silverlight proposée par Sun et reposant, entre autre, sur les technologies Java.
Quel est le principe d’une course?
Elle se décompose en un certain nombre de sujets. Chaque semaine (la plupart du temps), vous avez droit à un cours au format PDF sur un aspect de la technologie, puis à un TD pour la mise en pratique et enfin un exercice à réaliser. Celui-ci doit être envoyé à Sang Shin et à son équipe, qui vérifient la validité de l’exercice.
Au terme des x semaines de la course, si vous avez réussi l’ensemble des exercices, vous êtes récompensé par un certificat.
J’ai, pour ma part, suivi la première session de la course JavaFX, dont j’ai découvert l’existence en cours de route. J’ai, dès lors, rattrapé mon retard, pour envoyer la totalité des exercices en temps et en heure et je dois dire que certains m’ont donné du fil à retordre!
Je suis donc content de découvrir aujourd’hui que j’ai bien obtenu mon “certificat” JavaFX.
Et assez surpris de voir que je suis le seul français
En tout cas, ce fut une expérience de formation très intéressante et je salue la qualité de cette course!
Honnêtement, ça prend du temps, mais c’est de très loin la meilleure source de tutoriaux sur JavaFX que vous trouverez sur la Toile.
Si le cœur vous en dit, la deuxième session vient de démarrer.
Ça se passe ici!

Tags: ,

Installation et configuration de Subversion

Posted in Java/J2EE, Tutoriaux on juillet 21st, 2009 by Ajrarn

… le système de gestion des sources dans un projet est primordiale. C’est ce qui vous permettra de travailler en collaboration avec des collègues sans risque de perdre des données, de récupérer les différentes versions d’un fichier, de gérer les différences, les conflits, etc.
Dans le monde Java/J2EE, l’outil le plus usité était CVS (Concurrent Versions System). Il fonctionne sur un modèle centralisé où un serveur central regroupe tous les fichiers et les différentes versions de ceux-ci.
Un projet plus récent, fonctionnant sur le même principe, le remplace peu à peu. Subversion (ou SVN) a démarré en février 2000 et est donc parfaitement stable aujourd’hui.
Read more »

Tags:

Installation et configuration de Maven 2

Posted in Java/J2EE, Tutoriaux on juillet 13th, 2009 by Ajrarn

…le projet Maven, géré par l’Apache Software Foundation est de plus en plus utilisé dans le développement de projet Java/J2EE.

Mais qu’est-ce que Maven et qu’apporte-t-il dans vos projets?
Read more »

Tags:

Parisjug : Soirée RIA

Posted in Flex, Java/J2EE on juillet 10th, 2009 by Ajrarn

…j’ai participé à ma première soirée parisjug le 7 juillet.

Durant cette soirée dédiée aux RIAs, ont eu lieu 2 présentations intéressantes sur : Flex et JavaFX.

La présentation Flex a été réalisée par François Le Droff, architecte technique chez Adobe France, qui a mis en avant l’arrivée de Flex 4, l’utilisation de Spring Flex (voir mon post à ce sujet) et une petite démo de Catalyst.
Si je devais émettre une petite critique, je dirai que l’orateur a sans doute voulu trop en montrer dans un laps de temps trop court. La difficulté était que peu de personnes présentes connaissaient Flex : ceux-ci n’ont peut-être pas découvert grand chose de plus et les autres ont certainement été un peu noyés par la masse d’informations successives… Mais le présentateur n’est pas à blâmer, bien au contraire, l’exercice se révélant difficile et le début de la conférence étant quelque peu chaotique avec des problèmes de micro. Je suis en tout cas particulièrement intéressé pour récupérer le contenu de cette conférence et j’espère que parisjug mettra ça en ligne!

La présentation JavaFX a été réalisé en anglais par Simon Ritter, un évangéliste Java chez Sun. Excellent orateur, j’aurai tendance à dire l’inverse de la conférence précédente. M. Ritter nous en a montré trop peu en passant beaucoup de temps à nous présenter la syntaxe du langage de script de JavaFX et en détaillant ses APIs. Les démos de conclusion ont par contre été efficaces : la dernière incluant une WiiMote et une gestion Bluetooth par Java a eu un franc succès!

Cette première soirée parisjug m’a bien plu et on m’y reverra à l’avenir. Le grand nombre de participants assurent son succès et il y a là du potentiel relationnel.
La prochaine soirée concerne la Qualité du logiciel, à laquelle je ne pourrai malheureusement pas assisté pour cause de vacances.
Je ferai en sorte d’être des deux suivantes : JSF 2.0 et Google.

Tags: , , ,

Installation de Java

Posted in Java/J2EE, Tutoriaux on juillet 5th, 2009 by Ajrarn

…le développement d’un projet Java/J2EE nécessite que vous installiez Java sur votre poste de travail et plus précisément une version de développement.
Rappelons que communément, quand on parle d’installer Java, on parle du Java Runtime Environment (JRE), nécessaire pour exécuter les programmes Java sur un ordinateur (et dans un navigateur).
Le Java Development Kit (JDK) contient le JRE, ainsi qu’un ensemble d’outils et d’APIs (Application Programming Interface) permettant le développement de programmes. Read more »

Tags:

Spring BlazeDS Integration

Posted in Flex, Java/J2EE on juin 14th, 2009 by Ajrarn

… utiliser Flex 3 pour développer vos applications internet riches, c’est très bien, mais cette technologie ne se suffit pas à elle-même. En effet, Flex gère toute la partie IHM, c’est à dire, ce qui est visible et manipulable de votre application, mais cette technologie a besoin d’être couplée à un langage serveur, qui, en général, s’occupera du traitement métier (accès aux bases de données, etc.).

Il est fréquent de combiner Flex et Java pour répondre à ce besoin.
Adobe propose un projet open source, nommé BlazeDS, permettant de réaliser la passerelle entre le client Flex et le code métier Java. Il s’agit, en pratique, d’une servlet, ayant pour rôles d’invoquer les services Java adéquats, de traduire les objets Action Script de Flex en objet Java et vice-versa.

D’un autre côté, l’utilisation du framework Spring au sein des projets Java/J2EE devient presque incontournable (Spring, c’est par ici). Alors, bien sur, l’envie est forte de combiner Flex et Spring et jusqu’à peu de temps, on passait par une factory Spring pour réaliser celà (un tutoriel developpez.com très bien fait sur la question).

Mais les choses ont évolué depuis. Adobe et Springsource ont travaillé main dans la main pour la création d’un nouveau projet Spring : Spring BlazeDS Integration. Concrètement, Spring prend la main sur BlazeDS et toute la configuration se passe dans son fichier de configuration.
La pleine puissance de Spring dans son application Flex, ça donne envie!

J’ai décidé de reprendre le principe détaillé dans le tutoriel de developpez.com (voir ci-dessus) mais en le modifiant pour utiliser la version GA de Spring BlazeDS Integration, toute fraîche d’il y a quelques jours.

Pour commencer, vous aurez besoin de :

Décompressez tout ça et installez le JDK si nécessaire, puis lancez Eclipse.
Créez un nouveau projet Flex et donnez-lui un petit nom (SpringFlex dans mon cas), puis sélectionnez J2EE dans Application server type et cliquez sur Next.
Définissez votre serveur J2EE en sélectionnant Tomcat 6 et en pointant sur votre répertoire d’installation, puis indiquez la WAR de BlazeDS (il se trouve à la racine du répertoire dans lequel vous avez décompressé l’archive de BlazeDS).
Cliquez sur Finish, votre projet est créé.
Pour finir la configuration, cliquez droit sur ce nouveau projet et cliquez sur Properties.
Sélectionnez Flex Server et dans le champs Context Root, ajoutez le contexte de votre application (/SpringFlex dans mon cas).
Pour finir, dans la vue Servers (menu Windows / Show View / Other / Server / Servers) de votre Eclipse, faîtes un clic droit, sélectionnez Add and Remove Projects… et ajoutez votre projet dans les Configured projects.

Si vous galérez lors de ces étapes de configuration, allez jeter un oeil sur le tutoriel developpez.com. Tout y est clairement détaillé avec des captures d’écran.

Bon, les choses sérieuses commencent!

Pour ajouter Spring à votre application, il vous faut copier tous les fichiers jars, situé dans le dossier dist de votre répertoire d’installation de Spring dans le répertoire WebContent/WEB-INF/lib de votre projet.
Faîtes de même avec les jars ANTLR (situé dans le dossier lib de votre répertoire d’installation ANTLR), puis copiez le jar de spring flex (répertoire dist de votre répertoire d’installation de Spring BlazeDS Integration).
Il vous en manque encore (oui oui) mais comme je suis sympa, je vous les ai compressés ici. Ajoutez les également dans WebContent/WEB-INF/lib.

Il vous faut maintenant créer votre fichier de configuration Spring, que j’ai nommé application-context.xml (à la racine de WebContent/WEB-INF).
Voici son contenu :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:flex="http://www.springframework.org/schema/flex" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/flex 
    http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
    <bean id="welcomeServiceBean" class="fr.sokaris.service.WelcomeService"/>
    <flex:message-broker/>
    <flex:remoting-destination ref="welcomeServiceBean" />
</beans>

Comme vous pouvez le constater, nous définissons un bean correspondant à une classe WelcomeService.
Dans le répertoire src de votre projet, créez une nouvelle classe Java nommée WelcomeService et contenant le code suivant :

public class WelcomeService {
	public String sayHello(String pLogin){
		return "Bienvenue "+pLogin;
	}
}

Il faut ensuite que vous remplaciez votre fichier services-config.xml (situé dans WebContent/WEB-INF/flex) par celui-ci :

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
  <services>
    <default-channels>
      <channel ref="my-amf"/>
    </default-channels> 
  </services>
  <channels>
    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
      <endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf" 
        class="flex.messaging.endpoints.AMFEndpoint"/>
    </channel-definition>
    <channel-definition id="my-polling-amf" 
      class="mx.messaging.channels.AMFChannel">
      <endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amfpolling" 
        class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties>
          <polling-enabled>true</polling-enabled>
            <polling-interval-seconds>4</polling-interval-seconds>
          </properties>
    </channel-definition>
  </channels>
</services-config>

Ce sont les seules modifications à apporter à ce fichier. Regardez-le bien, vous ne l’ouvrirez plus jamais.

Il faut maintenant modifiez le web.xml afin de le configurer pour Spring. Remplacez votre fichier existant par celui-ci :

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>SpringFlex</display-name>
  <servlet>
    <servlet-name>spring-flex</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/application-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring-flex</servlet-name>
    <url-pattern>/spring/*</url-pattern>
  </servlet-mapping>
</web-app>

Voilà, nous y sommes! La configuration est complète…

Nous allons maintenant pouvoir créer l’interface Flex, à proprement parlé, qui va appeler notre classe Java par l’intermédiaire de Spring. Cette interface (reprise du tutoriel developpez.com, je le rappelle) est très simple : une zone de saisie pour indiquer un nom, un bouton pour valider et une zone de texte permettant d’afficher le résultat renvoyé par notre bean Java.

Voici le code du fichier SpringFlex.mxml (situé dans le répertoire flex_src de votre projet) :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="vertical" 
	width="451" 
	height="168" 
	paddingBottom="0" 
	paddingLeft="0" 
	paddingRight="0" 
	paddingTop="0">
 
  <mx:Script>
    <![CDATA[
      import mx.rpc.events.FaultEvent;
      import mx.rpc.events.ResultEvent;
 
      private function doCall():void{
        // Appeler le service distant
        roWelcomeService.sayHello(tiLogin.text);
      }
 
      /**
      * Méthode invoquée en cas de succès de l'appel RPC 
      */ 
      private function onResult(event : ResultEvent):void{
        // Afficher la réponse
        taReponse.text = event.result as String;
      }
 
      /**
      * Méthode invoquée en cas d'échec de l'appel RPC 
      */ 
      private function onFault(event : FaultEvent):void{
        // Afficher le message d'erreur
        taReponse.text = event.fault.message;
      }
 
    ]]>
  </mx:Script>
  <!--La balise mx:RemoteObject permet d'appeler
  le bean welcomeServiceBean--> 
  <mx:RemoteObject id="roWelcomeService" 
    destination="welcomeServiceBean"
    result="onResult(event)"
    fault="onFault(event)"/>
  <mx:Panel width="451" height="168"
    layout="absolute" 
    title="Hello World">
  <mx:Label x="10" y="10" text="Login : "/>
  <mx:TextInput id="tiLogin" 
    text="Guest"
    x="66" y="8" />
  <mx:Button id="btnAppel" 
    label="Appel de WelcomeService"
    x="234" y="8" 
    click="doCall()"/>
  <mx:Label x="10" y="38" text="Réponse :"/>
  <mx:TextArea id="taReponse" 
    x="81" y="37" width="327" height="81"/>
  </mx:Panel>
</mx:Application>

Nous y voilà enfin… Démarrez votre serveur tomcat, puis lancez votre navigateur sur l’URL suivante (à adapter en fonction du nom de votre projet) : http://localhost:8080/SpringFlex/SpringFlex.html

L’interface Flex devrait s’afficher dans la page html. Renseignez une donnée dans le champs login (exemple : Ajrarn) et cliquez sur le bouton Appel de WelcomeService.
Le résultat attendu (exemple : Bienvenue Ajrarn) s’affiche alors…

Vous allez vous dire : tout ça pour ça…

Je vous répondrai tout d’abord que vu le temps que j’y ai passé par rapport à vous pour parvenir à faire marcher tout ça, vous faîtes un bon deal! (^_^)
Deuxièmement, ce n’est évidemment qu’un petit tutoriel simpliste, qui ne fait que gratter la surface des possibilités. L’important derrière ce nouveau projet Spring est toutes les fonctionnalités qu’il apporte à vos applications Flex : authentification, sécurité, etc.
Intéressés? C’est par que ça se passe.

Tags: , , , ,

Java Scripting

Posted in Java/J2EE on mai 28th, 2009 by Ajrarn

… depuis sa version 6, Java intègre une nouvelle fonctionnalité nommée : Java Scripting.
Comme son nom l’indique plus ou moins, cela permet de manipuler directement des langages de script dans vos classes Java.

Vous vous demandez peut-être l’intérêt qu’il y a à procéder de la sorte, mais si si, il y en a!
Pour rappel, pour beaucoup de langages de script :

  • Il n’y a pas de typages, ou pas de typages obligatoires.
  • Pas de compilation à gérer, un déploiement trivial, bien adapté au développement de prototypes par exemple.
  • Il y a certaines fonctionnalités très appréciables comme la lecture d’un fichier XML de manière très simple.

Cette nouvelle fonctionnalité permet de manipuler un grand nombre de langages de script, dont les suivants : Groovy, Jaskell, Python, Ruby, Velocity, XPath, XSLT pour ne nommer qu’eux (ou plutôt que ceux que je connais! (^_^) ). L’utilisation de l’un d’entre eux vous demandera d’ajouter le jar adéquat dans votre projet.

Par contre, nativement, Java 6 intègre Rhino : Javascript for java, un projet Mozilla.

Alors, comment ça marche?
Commençons par un exemple simple. Imaginons que nous ayons un fichier add10.js contenant le code suivant :

var j = 10;
println(i + j);

Voici un exemple, en Java, montrant comment injecter une variable dans ce code javascript et le jouer :

import java.io.FileNotFoundException;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestScripting {
	public static void main(String[] args) {
	// Création du manager du moteur de script
        ScriptEngineManager factory = new ScriptEngineManager();
        // Création du moteur Javascript
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        try {
        	int a = 10;
        	// On fournit la variable "i" au code Javascript
        	engine.put("i", a);
        	// Evaluation du code du fichier add10.js
		engine.eval(new java.io.FileReader("script/add10.js"));
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

En exécutant ce fichier Java, vous devriez voir la valeur 20 apparaître dans votre console de sortie.

Allons un peu plus loin.
Considérons que nous avons une classe Java nommée Person et définie comme suit :

public class Person {
	public String firstName;
	public String lastName;
	public int age;
 
	Person (String firstName, String lastName, int age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}
}

Et le fichier Javascript infoPerson.js suivant :

function getAge(person) {
	return person.age;
}
 
function getFirstName(person) {
	return person.firstName;
}
 
function getLastName(person) {
	return person.lastName;
}

Voici comment appeler une méthode Javascript, en lui passant un paramètre (objet qui plus est) et en récupérer le résultat :

import java.io.FileNotFoundException;
 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestScripting {
	public static void main(String[] args) {
		// Création du manager du moteur de script
		ScriptEngineManager factory = new ScriptEngineManager();
		// Création du moteur Javascript
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		try {
			Person person = new Person("Pascal", "VERRECCHIA", 29);
 
			// Evaluation du code du fichier infoPerson.js
			engine.eval(new java.io.FileReader("scripts/infoPerson.js"));
 
			Invocable inv = (Invocable) engine;
			// Appel de la méthode Javascript "getAge" en passant l'objet person
			// en paramètre et cast du résultat pour obtenir un entier.
			int age = (Integer) inv.invokeFunction("getAge", person);
 
			System.out.println("age : " + age);
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
	}
}

Vous devriez voir age : 29 dans votre console après exécution de ce code Java.
Vous aurez remarqué que le fait d’envoyer un objet au Javascript ne pose pas de problèmes!
La valeur retournée par une méthode Javascript est de type Object. Il sera donc nécessaire de parser le résultat en conséquence.

Voilà pour les grandes lignes du Java Scripting.
Si vous souhaitez aller plus loin, allez vous promener par .

Un petit bémol, cependant, concernant l’intégration de Rhino dans Java 6 : toute la partie E4X (ECMAScript for XML) a été exclue… Et ça, c’est bien dommage, parce que E4X, pour travailler sur du XML, c’est tout de même sacrément sympa…

Si c’est ce type de besoin que vous recherchez, je vous conseille de vous orienter vers Groovy et/ou XPath.

Tags: ,

La génération de site avec Maven

Posted in Java/J2EE on mai 18th, 2009 by Ajrarn

Maven offre la fonctionnalité très appréciable de génération automatisée du site web de votre projet Java/J2EE.

Il est de plus en plus fréquent de voir des sites de frameworks, librairies ou projets utilisés cette fonctionnalité comme le propre site de Maven, le site de Struts ou celui de Tapestry. Notez tout de même que ces trois exemples sont des projets Apache.

L’avantage principal de la génération de site par Maven est la possibilité d’utiliser des plugins permettant la génération de rapports liés à votre projet : rapport checkstyle et PMD, mise en ligne automatique de la Javadoc, afficher les sources en ligne, le résultat des tests unitaires, la couverture des tests unitaires de votre code, etc.

Pour commencer, il vous faut donc ajouter ces plugins dans le pom.xml principal de votre projet.

Voici la marche à suivre pour obtenir les rapports checkstyle, la Javadoc, les résultats des tests unitaires avec surefire, la couverture des tests unitaires avec Cobertura et la possibilité de visualiser les sources en ligne avec JXR :

<build>
  <plugins>
  ...
    <plugin>
      <groupId>
        org.codehaus.mojo
      </groupId>
      <artifactId>
        cobertura-maven-plugin
      </artifactId>
      <executions>
        <execution>
          <goals>
            <goal>
              clean
            </goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
...
</build>
<reporting>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <configuration>
        <aggregate>true</aggregate>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jxr-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>cobertura-maven-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
      <version>2.4.3</version>
    </plugin>
  </plugins>
</reporting>

Lorsque nous exécuterons la commande de génération de code, des pages HTML liées à ces différents rapports seront générées automatiquement.

Mais avant d’en arriver à cette étape, il nous est nécessaire de mettre en place le fichier de configuration et description de notre future site Maven.

Il faut créer un fichier site.xml dans un répertoire src/site/ sur votre projet. Ce fichier va vous permettre de gérer les menus du site et les différentes pages que vous souhaitez mettre en place.

Cette étape n’est pas obligatoire. Il est possible de générer automatiquement un site très simplement en ajoutant quelques informations dans le pom.xml et en profitant de celles que vous avez déjà fournies, mais le résultat est sommaire.

Voici un exemple simple d’un fichier site.xml pour un projet classique :

<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Nom du projet">
  <publishDate position="none" />
  <version position="none" />
  <body>
    <menu name="Général">
      <item name="Introduction" href="index.html" />
      <item name="Structure du projet" href="structure.html" />
      <item name="Concepts de développement" href="concepts.html" />
      <item name="Evolution du projet" href="evolutions.html" />
    </menu>
    <menu name="Documentation du projet">
      <item name="Informations" href="informations.html" collapse="true">
        <item name="Résumé du projet" href="project-summary.html"/>
        <item name="Equipe du projet" href="team-list.html"/>
        <item name="Dépendances" href="dependencies.html"/>
        <item name="Management des Plugins" href="plugin-management.html"/>
        <item name="Plugins du projet" href="plugins.html"/>
      </item>
      <item name="Rapports" href="rapports.html" collapse="true">
        <item name="JavaDocs" href="apidocs/index.html"/>
        <item name="JavaDocs des Tests" href="testapidocs/index.html"/>
        <item name="Accès aux sources" href="xref/index.html"/>
        <item name="Accès aux sources de tests" href="xref-test/index.html"/>
        <item name="Tests unitaires" href="surefire-report.html"/>
        <item name="Couverture des tests unitaires" href="cobertura/index.html"/>
        <item name="Checkstyle" href="checkstyle.html"/>
      </item>
    </menu>
  </body>
</project>

Dans ce fichier, tous les fichiers HTML liés aux rapports sont générés automatiquement par Maven lors de l’étape de génération du site.

Il reste donc à écrire les pages “internes” comme project_summary.html, par exemple.

Pour se faire, nous allons utiliser le format type wiki APT, proposé par Maven 2 pour une écriture plus simple et plus rapide. Les fichiers APT doivent être positionnés dans le répertoire src/site/apt/ de votre projet. Lors de la génération du site, les fichiers APT sont analysés par Maven, qui génère alors les fichiers HTML correspondant.

Voici en exemple (qui vous resservira peut-être), l’écriture du fichier rapports.apt permettant de pointer sur les différents rapports générés :

    ----------------
    Rapports générés
    ----------------
 
Rapports générés
 
*----+------+
|| Document || Description |
*----+------+
| {{{./apidocs/index.html}JavaDocs}} | Documentation de l'API avec les JavaDocs |
*----+------+
| {{{./testapidocs/index.html}JavaDocs des Tests}} | Documentation de l'API des tests avec les JavaDocs |
*----+------+
| {{{./xref/index.html}Accès aux sources}} | Accéder aux sources du projet au format HTML |
*----+------+
| {{{./xref-test/index.html}Accès aux sources de tests}} | Accéder aux sources de tests du projet au format HTML |
*----+------+
| {{{./surefire-report.html}Tests unitaires}} | Rapport des tests unitaires effectués sur le projet |
*----+------+
| {{{./checkstyle.html}Checkstyle}} | Rapport Checkstyle sur les conventions de codage |
*----+------+

La syntaxe :

*----+------+
|| Cellule titre colonne 1 || Cellule titre colonne 2 |
*----+------+
| cellule1 | cellule2 |
*----+------+
| cellule3 | cellule4 |
*----+------+

permet de décrire une table HTML.

La syntaxe :

{{{./something.html}Something}}

permet de mettre en place un lien HTML.

Pour plus d’informations sur la syntaxe APT, allez ici.

Une fois que vous aurez créé les différentes pages que vous souhaitez voir sur le site web de votre projet, il ne vous reste plus qu’à générer celui-ci.

Pour se faire, rien de plus simple. Rendez-vous à la racine du répertoire de votre projet (ou doit se trouver votre pom.xml normalement) puis lancez la commande :

mvn site


La totalité des pages HTML générées se trouve dans le répertoire /target/site/ du projet.
Il est d’ailleurs conseillé de supprimer complètement ce répertoire avant toute nouvelle génération.
J’ai déjà remarqué la “non-regénération” de pages existantes.

Pour voir le résultat, il ne vous reste plus qu’à lancer, dans votre navigateur, le fichier index.html se trouvant en racine du répertoire /target/site/.

Vous pouvez également préférer la commande :

mvn site:run


qui exécutera la génération du site et le lancera automatiquement sur un serveur Jetty sur localhost:8080.

Pour informations, le port est configurable. Plus d’informations ici.

Tags:

Le plugin Maven 2 pour utiliser JAXB-2

Posted in Java/J2EE on mai 7th, 2009 by Ajrarn

…le projet sur lequel je travaille, pour mon client actuel, et sur lequel j’ai mis en place une structure de gestion de projet avec Maven 2, nécessite l’utilisation de JAXB-2.

J’ai ainsi découvert qu’il existait un plugin Maven très simple d’utilisation, permettant de générer les classes Java correspondant aux schémas .xsd automatiquement durant la phase de compilation de Maven.

Avant de rentrer dans le vif du sujet, je précise que j’utilise la dernière version du JDK 1.6 : le 1.6.0_13.

Java 6 propose les APIs JAXB 2.1 dans son rt.jar depuis l’update 4, semble-t-il. Mettez donc à jour votre JDK pour profiter pleinement de JAXB-2.

Pour utiliser JAXB-2 directement avec Maven, il est nécessaire d’ajouter un plugin dédié dans votre fichier pom.xml et de forcer la compilation Java avec une version 1.6.

Voici ce que vous devez ajoutez :

<build>
  <plugins>
  ...
    <plugin>
      <groupId>
        org.jvnet.jaxb2.maven2
      </groupId>
      <artifactId>
        maven-jaxb2-plugin
      </artifactId>
      <executions>
        <execution>
          <goals>
            <goal>
              generate
            </goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <inherited>
        true
      </inherited>
      <groupId>
        org.apache.maven.plugins
      </groupId>
      <artifactId>
        maven-compiler-plugin
      </artifactId>
      <configuration>
        <source>
          1.6
        </source>
        <target>
          1.6
        </target>
      </configuration>
    </plugin>
    ...
  </plugins>
...
</build>

Il ne vous reste plus qu’à ajouter vos schémas XML (.xsd) dans le répertoire de ressources src/main/resources et de lancer la phase de compilation Maven, en vous plaçant dans le répertoire de votre projet contenant le pom.xml et en lançant la commande suivante :

mvn compile

ou directement :

mvn install

Vous trouverez les classes résultantes de la génération JAXB-2 dans le répertoire target/generated-sources/xjc.

Si en plus, vous utilisez Eclipse et le plugin M2Eclipse, vous n’avez rien à faire du tout… Les classes sont générées directement lorsque vous enregistrez votre pom.xml.

Magique non?

Pour finir, un petit rappel sur la manière de sérialiser vos objets Java à partir d’un fichier XML avec JAXB.

Je pars du principe qu’un fichier test.xml se trouve dans le classpath du projet et qu’on souhaite sérialiser une classe Toto.

JAXBContext jaxbContext = null;
Toto toto = null;
try {
  jaxbContext = JAXBContext
        .newInstance(Config.class);
  Unmarshaller unMarshaller = jaxbContext
        .createUnmarshaller();
  InputStream is = getClass()
        .getResourceAsStream("/test.xml");
  toto = (Toto) unMarshaller
        .unmarshal(is);
} catch (JAXBException e) {
  //Un petit commentaire
  //Une trace de log
  //La gestion de l'exception
}

Tags: , , , , , ,

JavaBlackBelt

Posted in Java/J2EE on mai 4th, 2009 by Ajrarn

…j’ai la grande, que dis-je… L’Immense fierté de vous annoncer l’obtention de ma ceinture orange sur JavaBlackBelt (si si, je suis dans la liste, cherchez bien)!!

Je ne manquerai évidemment pas de vous faire part d’une éventuelle montée en grade (c’est à dire pas tout de suite je pense)!

Ça méritait bien un post, ça, pas vrai?… Non?

Tags: