mercredi, décembre 28, 2011

Développement de clients riches par les modèles, découpage en parties

Je profite de ces vacances de noël pour avancer un peu plus sur le nouveau support de cours concernant le développement de clients riches par les modèles. J'avance assez vite et j'ai pratiquement la partie modélisation avec EMF de terminer. Puisque je ne souhaite pas proposer un seul gros pavé, je pense que je vais découper le nouveau support en plusieurs parties en m'appuyant sur le plan qui était proposé dans le précédemment billet
  • Introduction à la modélisation ;
  • Développer des modèles avec EMF ;
  • Interfaces Graphiques avec EMF ;
  • Persistance (Fichier, TENEO, CDO) ;
  • Validation (OCL, validation de l'IHM).
Le premier à sortir sera donc "Développer des modèles avec EMF". Le plan détaillé sera le suivant
  • Généralités EMF
  • Modèle Ecore
    • Présentation des déclarations
    • Présentation Structural Feature (volatile, dérivé, ...)
  • Définir un modèle EMF 
    • Création du modèle
    • Générer le code Java (utilité du genmodel)
    • Mise à jour du code Java (intérêt du @generated)
    • Générer le code de l'éditeur
  • Instancier un modèle par les APIs
  • Sauvegarder et charger des instances du modèle
  • Manipuler le méta-modèle EMF
    • Interrogation
    • Création et modification
  •  Utiliser EMF sans conteneur OSGi (Swing, GWT)
  • Transactions avec EMF
    • Définition Domain
    • Command
    • Undo/Redo
  • Notifier les changements du modèle
J'ai découvert des choses intéressantes et notamment dans tout ce qui touche la manipulation du méta-modèle et les transactions.

Bien sur il y aura des exemples et même beaucoup qui essayeront de couvrir les principaux besoins quand on souhaite modéliser avec EMF.

samedi, décembre 17, 2011

Liens pratiques de la semaine

Vous trouverez dans ce billet une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines. 

Eclipse
  • Souhaitez-vous aider la communauté Eclipse afin de trouver le nouveau nom d'Eclipse 2013 ou Eclipse Juno +1 ? Tout se passe ici.
  • Eclipse 3.8 et 4.2 millestone 4 sont disponibles (page des nouveautés et page de téléchargement)
Java
  • Devoxx France 2012, c'est la version française de l'événement européen Devoxx organisée par le Paris JUG.  Cette session française se déroulera le 18 au 20 avril 2012 à Paris.

mercredi, décembre 07, 2011

Liens pratiques de la semaine

Vous trouverez dans ce billet une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.

Eclipse
  • Le composant graphique TreeMapper intègre le projet Nebula. TreeMapper est un composant graphique permettant l'association de nœuds entre deux arbres. Si vous avez déjà joué avec l'outil Eclipse BPEL Designer pour l'association des messages vous devez voir ce que je veux dire. 
  • Un article de Lars Vogel qui explique comment intégrer le site de mis à jour Eclipse p2 dans une application RCP. Très pratique si vous souhaitez ajouter des fonctionnalités à votre application
Java
  • Un très bon article sur les bases de JPA. Il est synthétique et présente tous les aspects importants de cette spécification.
  • Vu dans Developpef, Jelastic est une plateforme de cloud qui permet de créer des environnements de déploiement d'applications Java très facilement. Je me suis inscrit à la béta et j'ai été agréablement surpris par l'interface graphique.
  • Un article sur le Déploiement Continu qui explique comment déployer automatiquement une application Web à chaque commit sur un repository de sources.

vendredi, novembre 11, 2011

Nouveau support de cours en préparation : Développement de clients riches par les modèles

Depuis quelques jours je me suis renseigné sur les capacités d'utiliser EMF dans le cadre d'un développement de clients via la plateforme Eclipse. Après de nombreux échanges avec des habitués comme Mickael Istria et Angelo Zerr sur l'utilisation d'EMF dans RCP ou encore suite à l'événement Obeo Designer Roadshow de Niort organisé par la société OBEO, je me suis décidé à réaliser toute une série d'exemples couvrant toutes les facettes d'EMF pour étudier ce qu'il était possible d'en faire dans le cadre d'un développement Eclipse RCP. 

Ainsi, j'obtiens des résultats très intéressants et je me rends compte que certaines choses que je devais coder moi-même (persistance, notification, binding, validation, transaction, undo/redo, ...) étaient fournis "gratuitement" par EMF puisque son API est très complète. Par ailleurs, l'approche par modèle amène le développeur à se focaliser plus sur le métier que sur les problèmes techniques.

Je me propose donc de travailler sur un nouveau support de cours intitulé pour l'instant "Développement de clients riches par les modèles" dont les principales parties sont décrites ci-dessous :
  • Introduction à la modélisation ;
  • Développer des modèles avec EMF (concevoir un modèle EMF, création d'instantes via une API) ;
  • Interfaces Graphiques avec EMF (Binding, WritableValue, Dirty, WindowBuilder) ;
  • Persistance (Fichier, TENEO, CDO) ;
  • Validation (OCL, validation de l'IHM).
Le but de ce nouveau support est de présenter tous les points qui peuvent être utilisés pour développer une application RCP avec EMF. Il y aura par conséquent de nombreux exemples. Par ailleurs, au fur et à mesure de l'avancement du support de cours, j'en profiterai pour poster des billets sur ce blog.

Qu'en pensez-vous ?

vendredi, octobre 28, 2011

Construction automatique d'un product Eclipse avec Maven Tycho disponible sur Developpez.com

Une version étendue du billet sur la construction de product Eclipse avec le plugin Maven Tycho est disponible sur le site de Developpez.com.

L'article n'apporte rien de nouveau sur Tycho mais étoffe l'introduction et l'installation des outils.

Si vous avez des commentaires, n'hésitez pas.

dimanche, octobre 23, 2011

J'ai besoin ... d'une introduction à Hibernate OGM

Pour rappel dans un précédent billet, lors de la dernière session du JUG Poitou-Charentes j'ai assisté à une présentation d'Hibernate OGM par Emmanuel BERNARD. Ce framework apporte la dimension ORM pour les solutions de stockage à base de clé/valeur. Plus précisément Hibernate OGM offre une implémentation JPA (manipulation d'objet et requêtes JP-QL) tout en stockant et requétant les données d'une grille clé/valeur. Ainsi, il offre une API familière tout en permettant de bénéficier des possibilités de scalabilité des solutions NoSQL. Hibernate OGM inclus notamment de supporter des applications JPA existantes.

Pour l'instant Hibernate OGM est en phase de prototype (version alpha). Il est actuellement possible de faire du CRUD avec des entités via l'API de JPA. Toutefois, les requêtes JP-QL ne sont pas encore prises en compte et seule la solution NoSQL Infinispan (clé/valeur) est supportée. Des dialects pour d'autres solutions clé/valeur et familles (orientées document et colonnes) sont à l'étude.

L'objectif de ce billet est dans un premier temps de montrer comment télécharger les sources d'Hibernate OGM à partir de eGIT, de construire ces sources afin d'obtenir le JAR et de l'exploiter dans un projet Maven (je me dis que ça pourra toujours servir). Dans un second temps, nous allons persister des entités à partir d'un modèle simple (commande de produits) et expliquer comment les données ont été stockées dans la solution de stockage Infinispan.

Prérequis logiciels
Cette section présente les logiciels utilisés pour la réalisation de ce billet.
  • Eclipse 3.7 Indigo : la version actuelle lors de l'écriture de ce billet. Toutefois, un autre environnement pourrait bien sur faire l'affaire (IntelliJ ou Netbeans) ou même une version antérieure à Indigo.
  • eGIT : le client GIT pour Eclipse ou tout autre client GIT avec ou sans intégration dans Eclipse.
  • M2Eclipse : l'intégration Maven pour Eclipse. Ce plugin n'est pas obligatoire. Toutes les opérations d'exécution de commande Maven pouvant se faire à partir de l'invite de commande Windows.
  • Maven 3 : l'outil de construction de binaire obligatoire pour construire le binaire d'Hibernate OGM. J'ai utilisé la version 3 mais la version 2 peut également faire l'affaire.
Dans la suite de ce billet, je suppose que tous ces outils sont déjà installés. Si vous avez des problèmes pour les installer, n'hésitez pas à vous rendre sur le site des outils où généralement un détail sur la procédure d'installation est disponible.

Récupération des sources
Cette section décrit toutes les étapes nécessaires à la récupération des sources d'Hibernate OGM et à la création d'un projet Java pour faciliter la construction du binaire d'Hibernate OGM.
  • Ouvrir la perspective GIT (Window -> Open Perspective -> Other ... -> Git Respository Exploring)
  • Cliquer sur l'action "Clone a GIT repository and add the clone to this view" (voir capture d'écran ci-dessous)
  • Une boite de dialogue doit s'afficher et saisir les informations comme indiquées sur la capture d'écran ci-dessous puis faire Next (les sources d'Hibernate OGM se trouvent sur GITHub et l'URL est https://github.com/hibernate/hibernate-ogm.git)
  •  Sélectionner Master puis faire Next (voir capture d'écran ci-dessous)
  • Sélectionner le répertoire parent de votre Workspace et donner comme nom de répertoire cible le nom hibernate-ogm, puis faire Finish (voir capture d'écran ci-dessous). Les sources vont être téléchargés dans le répertoire précisé.
  • Pour transformer ce répertoire en un projet Java, ouvrir la perspective GIT Repository et déplier le nœud hibernate-ogm
  • Afficher le menu contextuel à partir du sous nœud Working Directory et sélectionner l'élément Import Projects ...
  • Depuis la boite de dialogue qui vient de s'ouvrir, sélectionner le nœud Import as General Project et choisir le répertoire hibernate-ogm, puis faire Next (voir capture d'écran ci-dessous)
  • Faire Finish pour que ce répertoire devienne un projet Java (voir capture d'écran ci-dessous)
  • Ouvrir la perspective Java
  • Depuis le projet hibernate-ogm, afficher le menu contextuel et activer la gestion des dépendances Maven (Maven -> Enable Dependency Management)
Vous obtiendrez donc un projet appelé hibernate-ogm contenant à sa racine un fichier de description Maven parent. Deux sous modules sont disponibles hibernate-ogm-documentation et hibernate-ogm-core. Le projet hibernate-ogm-documentation contient une documentation présentant les grandes généralités d'Hibernate OGM. Ce projet contient également un exemple basique pour débuter. Le projet hibernate-ogm-core contient les sources et les tests unitaires du projet Hibernate OGM.

Construction des binaires Hibernate OGM
La construction des binaires se fait par l'intermédiaire de Maven et de la commande suivante à partir du premier fichier de description Maven

mvn clean package

Possibilité de construire la documentation en utilisant la commande suivante

mvn clean install -DbuildDocs=true

Ou directement lancer la construction à partir du répertoire hibernate-ogm/hibernate-ogm-documentation

Création d'un projet Maven avec une dépendance vers Hibernate OGM
A partir d'Eclipse, créer un nouveau projet Maven et définir les paramètres d'identification du projet et de dépendances aux différentes bibliothèques comme cela est indiqué ci-après

<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>keulkeul.hibernate.ogm</groupId>
 <artifactId>keulkeul.hibernate.ogm.firstexample</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
  <dependency>
   <groupId>org.hibernate.ogm</groupId>
   <artifactId>hibernate-ogm-core</artifactId>
   <version>3.0.0-SNAPSHOT</version>
  </dependency>
  <dependency>
   <groupId>javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.12.1.GA</version>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>1.6.1</version>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.6.1</version>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>org.jboss.jbossts</groupId>
   <artifactId>jbossjta</artifactId>
   <version>4.15.0.Final</version>
   <exclusions>...</exclusions>
  </dependency>
 </dependencies>
 <pluginRepositories>
  <pluginRepository>
   <id>jboss-public-repository-group</id>
   <name>JBoss Public Maven Repository Group</name>
   <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
   <layout>default</layout>
   <releases>
    <enabled>true</enabled>
    <updatePolicy>never</updatePolicy>
   </releases>
   <snapshots>
    <enabled>true</enabled>
    <updatePolicy>never</updatePolicy>
   </snapshots>
  </pluginRepository>
 </pluginRepositories>
  <repositories>
   <repository>
    <id>jboss-public-repository-group</id>
    <name>JBoss Public Maven Repository Group</name>
    <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
    <layout>default</layout>
    <releases>
     <enabled>true</enabled>
     <updatePolicy>never</updatePolicy>
    </releases>
    <snapshots>
     <enabled>true</enabled>
     <updatePolicy>never</updatePolicy>
    </snapshots>
   </repository>
  </repositories>
</project>
    A noter que pour les exclusions de dépendances, ceci est rendu nécessaire dû fait de conflits entre versions de bibliothèques. La version complète du pom.xml est disponible dans les sources du projet fournis à la fin de ce billet.

    Création des classes entités
    Pour la suite, nous allons exploiter un exemple de gestion de commande. Puisque nous utilisons la convention de nommage anglophone pour le codage, le nom des classes et attributs seront écrites en anglais.

    Une commande (Order) concerne un ensemble de produit (classe Product). Une commande contient une adresse de livraison (Address). Un produit fait partie d'une catégorie (Category). Ci-dessous sont présentées les classes, en détaillant les annotations JPA. Pour l'instant, rien de nouveau. Pour les développeurs ayant déjà des connaissances JPA ils retrouveront leurs marques. Par ailleurs, cet exemple tente de montrer l'implémentation de toutes les relations possibles.

    A noter que toutes les classes définissent une clé primaire (que nous appellerons par la suite PK pour Primary Key). La déclaration de cette clé primaire est définie en JPA de cette manière.

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "RID", nullable = false)
    private Long id;

    Classe Address
    Une adresse possède un seul attribut description de type chaine de caractères.

    @Entity
    public class Address {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "RID", nullable = false)
     private Long id;
    
     private String description;
    
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
     public String getDescription() {
      return description;
     }
    
     public void setDescription(String description) {
      this.description = description;
     }
    }

    Classe Product
    Un produit possède également une description et fait référence à une catégorie. Il y a une relation inverse qui permet d'obtenir l'ensemble des produits à partir d'une catégorie (voir ci-après).

    @Entity
    public class Product {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "RID", nullable = false)
     private Long id;
     
     @ManyToOne
     @JoinColumn(name = "category_fk")
     private Category category;
    
     private String description;
     
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
     public Category getCategory() {
      return category;
     }
    
     public void setCategory(Category category) {
      this.category = category;
      this.category.getProducts().add(this);
     }
    
     public String getDescription() {
      return description;
     }
    
     public void setDescription(String description) {
      this.description = description;
     }
    }

    Classe Categoy
    Une catégorie possède également une description. L'attribut products permet de représenter la relation inverse précédemment citée.

    @Entity
    public class Category {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "RID", nullable = false)
     private Long id;
    
     @OneToMany(mappedBy = "category")
     private List products;
    
     private String description;
    
     public Category() {
      products = new ArrayList();
     }
     
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
     public List getProducts() {
      return products;
     }
    
     public void setProducts(List products) {
      this.products = products;
     }
    
     public String getDescription() {
      return description;
     }
    
     public void setDescription(String description) {
      this.description = description;
     } 
    }

    Classe Order
    Une commande définit une liste de produits et une adresse.

    @Entity
    public class Order {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "RID", nullable = false)
     private Long id;
    
     @OneToOne
     @JoinColumn(name = "address_fk", nullable = false)
     private Address deliveryAddress;
     
     @OneToMany
     @JoinTable(name = "t_order_product", joinColumns = {@JoinColumn(name="order_fk")}, inverseJoinColumns = {@JoinColumn(name = "products_fk")})
     private List products;
     
     public Address getDeliveryAddress() {
      return deliveryAddress;
     }
    
     public void setDeliveryAddress(Address deliveryAddress) {
      this.deliveryAddress = deliveryAddress;
     }
     
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
     public List getProducts() {
      return products;
     }
    
     public void setProducts(List products) {
      this.products = products;
     }
    }
    

    Création du fichier de persistance (persistence.xml)
    Vous trouverez ci-dessous le source du fichier persistence.xml utilisé pour préciser le provider et le type de transaction (ici via JTA)

    <?xml version="1.0"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
     <persistence-unit name="org.hibernate.ogm.tutorial.jpa" transaction-type="JTA">
      <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
      <properties>
       <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTSStandaloneTransactionManagerLookup"/>
      </properties>
     </persistence-unit>
    </persistence>

    Classe principale OrderRunner
    Nous détaillons dans la classe OrderRunner le programme servant 1) à persister les données 2) à extraire ces données et 3) à voir comment ces données sont stockées dans Infnispan. Dans les deux premiers problèmes, il n'y aura rien de nouveau. Nous utiliserons les mécanismes initiaux de JPA.

    Persistances des données
    Tout d'abord nous initialisons l'objet TransactionManager et l'EntityManagerFactory par rapport au contenu donné dans le fichier persistence.xml.

    Par la suite nous ouvrons une transaction et nous initialisons des instances de notre modèle puis nous commitons. La fermeture de la transaction a pour effet de persister les données dans Infinispan. C'est donc Hibernate OGM qui se charge de passer de ce monde objet à un monde binaire (Map d'Infinispan).

    public class OrderRunner {
     public static void main(String[] args) throws NotSupportedException, ... {
      TransactionManager tm = new JBossTSStandaloneTransactionManagerLookup().getTransactionManager(null);
      EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.hibernate.ogm.tutorial.jpa");
      tm.begin();
      EntityManager em = emf.createEntityManager();
      Address compagny = new Address();
      compagny.setDescription("This is Address");
      em.persist(compagny);
    
      Category category = new Category();
      category.setDescription("Multimedia");
      em.persist(category);
    
      Product product1 = new Product();
      product1.setDescription("TV");
      product1.setCategory(category);
      em.persist(product1);
    
      Product product2 = new Product();
      product2.setDescription("Moto");
      product2.setCategory(category);
      em.persist(product2);
    
      Order myOrder = new Order();
      myOrder.setDeliveryAddress(compagny);
      List products = new ArrayList();
      products.add(product1);
      products.add(product2);
      myOrder.setProducts(products);
      em.persist(myOrder);
    
      em.flush();
      em.close();
      tm.commit();
      
      ...

    Extraction des données
    Par rapport aux précédentes instances, nous nous appuyons sur les identifiants existants pour extraire les données de la BD. Hibernate OGM effectue l'opération inverse et transforme une relation binaire en une représentation objet.

      tm.begin();
      em = emf.createEntityManager();
      product1 = em.find(Product.class, product1.getId());
      System.out.println(product1.getId());
      product2 = em.find(Product.class, product2.getId());
      System.out.println(product2.getId());
      myOrder = em.find(Order.class, myOrder.getId());
      System.out.println(myOrder.getId());
      compagny = em.find(Address.class, compagny.getId());
      System.out.println(compagny.getId());
      category = em.find(Category.class, category.getId());
      System.out.println(category.getId());

    Données dans Infinispan
    Nous faisons une extraction du cache d'Infinispan selon la session en cours. Puis nous réalisons un affichage du contenu de la Map.

      Cache entityCache = getEntityCache(em.unwrap(Session.class));
      Set keySet = entityCache.keySet();
      for (Object object : keySet) {
       System.out.println(displayValue(entityCache, object));
      }
    
      em.flush();
      em.close();
      tm.rollback();
    
      emf.close();
     }
    
     public static Cache getEntityCache(Session session) {
      final SessionFactoryObserver observer = getObserver(session.getSessionFactory());
      return ((GridMetadataManager) observer).getCacheContainer().getCache(GridMetadataManagerHelper.ENTITY_CACHE);
     }
    
     private static SessionFactoryObserver getObserver(SessionFactory factory) {
      final SessionFactoryObserver observer = ((SessionFactoryImplementor) factory).getFactoryObserver();
      if (observer == null) {
       throw new RuntimeException("Wrong OGM configuration: observer not set");
      }
      return observer;
     }
    
     private static String displayValue(Cache currentCache, Object key) {
      String returnValue = key + " value";
    
      Object value = currentCache.get(key);
      
      if (value instanceof AtomicHashMap) {
       AtomicHashMap infinispanCache = (AtomicHashMap) value;
    
       returnValue += "{";
       Set keySet = infinispanCache.keySet();
       for (Object object : keySet) {
        returnValue += object + "=" + infinispanCache.get(object) + ",";
       }
       returnValue = returnValue.substring(0, returnValue.length() - 1);
       returnValue += "}";
      } else {
       returnValue += value;
      }
      return returnValue;
     }
    }

    Nous obtenons le résultat ci-dessous.


    Comme vous pouvez le constater les valeurs contiennent la sérialisation de l'instance d'une classe. Hibernate OGM se charge d'effectuer cette transformation à la fois pour la sérialisation et la désérialisation.

    Conclusion
    Cette première introduction montre les possibilités offerte par Hibernate OGM pour utiliser JPA dans le monde des solutions de stockage à la mode NoSQL. Le projet est très promoteur et reste à voir comment les requêtes JPQL pourront être intégrées dans les prochaines versions.

    Toutefois même si Hibernate OGM permet à un développeur habitué à JPA de pouvoir exploiter la puissance de celui-ci pour les solutions types clé/valeur je n'arrive pas voir comment généraliser cela à tous les modèles à objets. En effet à la base un modèle à objet est fortement structuré (les valeurs nuls peuvent exprimer quelque chose) tandis que les solutions clé/valeur sont plus adaptées à des données faiblement structurées. Par ailleurs, il est dit que les solutions clé/valeur explose les temps pour la lecture. Qu'en est-il si mon besoin initial nécessite une forte sollicitation en écriture (update par exemple). Enfin, il pourrait être intéressant d'effectuer des tests de performance avec ou sans Hibernate OGM et de voir les apports en fonction des besoins initiaux (lecture, insert, update, ...).

    Les sources de ce billet sont disponibles à cette adresse.

    dimanche, octobre 09, 2011

    Liens pratiques de la semaine

    Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.  

    Eclipse
    • Eclipse Orion, l'IDE dans le navigateur Web est disponible en version 0.3 Millestone 2 (page de téléchargement et page des nouveautés)
    • Eclipse 3.7.1 est disponible. Cette version intègre le support Java 7. Cette page énumère les nouveautés apportées par le langage et comment tout cela a été intégré dans Eclipse.
    • Chronon est un plugin Eclipse permettant d'historiser ces phases de debug. Un billet sur le sujet est disponible ici
    • Cela faisait longtemps que je n'avais pas proposer un lien sur les raccourcis clavier pour Eclipse, donc en voici un
    • Eclipse a 10 ans. Pour célébrer cela, la fondation a mis en ligne un outil pour visualiser l'historique des événements de la communauté. Chose intéressante, il vous est possible de participer à cette historique.
    Java
    • Logback est un système de gestion de log. Cet article présente comment traiter les exceptions avec Logback.
    • Trois billets intéressants traitant de la librairie Java Guava de Google. Le premier présente les classes utilitaires, le deuxième décrit les collections et le troisième illustre les entrées/sorties.
    • Un article sur Google GIN, l'outil d'injection de dépendance côté client pour GWT
    Divers
    • Un site sympathique qui montre graphiquement comment se déroule les différents algorithmes de tri.

    mercredi, septembre 21, 2011

    Liens pratiques de la semaine

    Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines. 

    Eclipse
    • Angelo Zerr fournit deux nouveaux billets (billet 1 et billet 2) sur l'utilisation de la spécification JAX-WS via le framework Apache CXF sous Eclipse
    • Un article qui présente comment utiliser et customiser les markers sous Eclipse
    • Eclipse Juno Milestone 2 est disponible (page des nouveautés et page de téléchargement). A noter que pour cette version seule la branche 4.x sera disponible à la sortie en juin.

    dimanche, septembre 18, 2011

    Atelier SOA - Leçon 3 : Développement de Services Web REST avec JAX-RS et NetBeans

    Une nouvelle leçon sur la série des atelier SOA est disponible. Elle concerne l'API JAX-RS pour le développement de Services Web REST à partir de la plateforme de développement Java. 

    La leçon insiste sur les développements serveur et client d'un Service Web REST. L'implémentation utilisée est JERSEY.

    La page de téléchargement de cette leçon est disponible à cette adresse : http://mbaron.developpez.com/soa/jaxrslesson3/

    Si vous avez des commentaires, n'hésitez pas, ce billet est fait pour cela

    vendredi, août 12, 2011

    Liens pratiques de la semaine

    Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.

    Eclipse
    • Angelo Zerr propose deux nouveaux billets sur l'utilisation de RAP pour le développement d'application riche sur le Web (billet 6 et billet 7). Angelo propose également une nouvelle série de billets (billet 1, billet 2, billet 3 et billet 4) pour expliquer les mécanismes de communication de type "push serveur" avec les WebSockets en détaillant la partie cliente et serveur.
    • Quelques billets sur des propositions d'astuces pour Tycho (billet 1 et billet 2)
    • Eclipse Juno Milestone 1 est disponible (page de nouveautés et page de téléchargement)
    Java
    • Une présentation sur les améliorations apportées par la nouvelle API Java NIO2. Vous trouverez également ici, un exemple montrant l'utilisation de l'API WatchService.

    jeudi, juillet 28, 2011

    La version Java 7 est sortie

    Oracle vient de publier la version finale de Java Runtime Edition (Java 7). Les principales nouveautés proposées sont listées ci-dessous :
    • Projet Coin (String dans les Switch, Exceptions multiples dans un Catch multiple, simplification de l'écriture des génériques, ...)
    • NIO 2 (nouvelle API pour la manipulation de fichiers, hook sur le système de fichiers, une copie de fichier)
    • L'invocation de langages dynamiques
    • De nombreux ajouts dans l'API
    • Un nouveau look pour la JavaDoc
    Pour télécharger la nouvelle version, veuillez vous rendre sur le site d'Oracle

    Pour connaître avec précision les changements opérés par cette version vous pouvez vous rendre sur le site d'OpenJDK.

    lundi, juillet 18, 2011

    J'ai besoin ... de réaliser un tunnel SSH et me connecter à un Proxy HTTP

    Je vous propose un billet un peu particulier puisque cela ne va pas traiter de Java ou d'Eclipse mais de configuration réseau. L'idée est de décrire pas à pas la mise en place d'un tunnel ou pont SSH. L'intérêt est de pouvoir encapsuler des données d'un protocole dans un autre protocole (ici le protocole SSH) et ainsi assurer une sécurité puisque les données qui transiteront dans le tunnel SSH seront chiffrées.

    Dans mon cas, je voulais savoir si je pouvais réaliser un tunnel SSH pour me connecter à un proxy HTTP le tout de manière sécurisée. L'idée avant tout est d'outrepasser les droits d'un sous réseau ayant bien entendu laisser ouvert le port 22 du protocole SSH.

    La mise en place d'un tunnel SSH nécessite du côté serveur, un serveur logiciel SSH et un proxy HTTP. Du côté client, une connexion au protocole SSH via un client et un paramétrage sur le navigateur seront nécessaires.

    Ma configuration réseau et pré-requis logiciels
    Comme vous pouvez vous en doutez toutes les configurations qui vont suivre sont fortement dépendantes de la nature de votre réseau. Je vous propose ci-dessous ma configuration réseau sur les deux côtés.

    Serveur
    • Windows 7
    • Une BBox Bouygues Telecom
    • Privoxy (pour le proxy HTTP)
    • MobaSSH (serveur SSH)
    Client
    • Windows 7
    • Sous réseau avec le protocole SSH (port 22) ouvert
    • Firefox (navigateur Web)
    • Client SSH PUTTY
    Il est clair que cela fonctionne également avec d'autres outils et systèmes d'exploitation. Pour les logiciels j'ai choisi la simplicité et la gratuité.

    Serveur

    Je vous propose dans cette section une description détaillée de l'installation et de la configuration des logiciels et du paramétrage réseau.

    Serveur SSH
    Sous Windows, je n'ai pas trouvé de serveur SSH qui n'encapsule pas le serveur SSH (OpenSSH) fournit par Cygwin. Il existe différentes distributions plus ou moins compliquées. J'utilise MobaSSH (http://mobassh.mobatek.net/) qui reste très simple en installation et en configuration.
    • Après téléchargement du ZIP, exécuter l'exécutable MobaSSH_Server_Home_1.XX.exe
    • N'appuyer pas sur le bouton Install It Now avant d'avoir autorisé la création de tunnel SSH (Settings -> PermitTunnel -> yes)

    • Choisir ensuite les comptes utilisateur Windows qui pourront se connecter au serveur SSH quitte à créer un compte spécifique (Users)
    • Cliquer sur le bouton Install It Now et le serveur SSH s'installera comme service Windows
    Proxy HTTP
    Du côté Proxy HTTP, j'ai choisi un petit programme tout simple Privoxy disponible en téléchargement sur cette page (http://www.privoxy.org/)
    • Choisir une version stable et sous Windows (privoxy_setup_3.0.17.exe)
    • Installer le programme et choisir par les options par défaut
    De nombreuses configurations sont nécessaires, vous pouvez toutefois laisser par défaut les paramètres. Le port du Proxy HTTP utilisé est 8118.

    Configuration du pare-feu de Windows

    Pour que vos serveurs soit accessibles au niveau de votre sous réseau, il va falloir indiquer au pare-feu Windows de laisser passer les données sortant du serveur SSH (port 22) et du Proxy HTTP (port ...). Pour cela nous allons définir des règles
    • Panneau de Configuration -> Pare-feu Windows
    • Sur la colonne de gauche choisir Paramètres avancés, une interface liée aux fonctions avancées de sécurité doit s'afficher (voir capture d'écran ci-dessous)
    • Ajouter une nouvelle règle pour le trafic entrant concernant le port 8118 lié au proxy (bouton droit sur Règles de trafic entrant -> Nouvelle règle ... puis choisir une règle de type Port -> TCP et saisir dans Ports locaux spécifiques la valeur 8118)
    • Ajouter une nouvelle règle pour le trafic entrant concernant le port 22 lié au protocole SSH (bouton droit sur Règles de trafic entrant -> Nouvelle règle ... puis choisir une règle de type Port -> TCP et saisir dans Ports locaux spécifiques la valeur 22)
    • Ajouter une nouvelle règle pour le trafic sortant concernant le port 8118 lié au proxy (bouton droit sur Règles de trafic sortant -> Nouvelle règle ... puis choisir une règle de type Port -> TCP et saisir dans Ports locaux spécifiques la valeur 8118)
    • Finalement, ajouter une nouvelle règle pour le trafic sortant concernant le port 22 lié au protocole SSH (bouton droit sur Règles de trafic sortant -> Nouvelle règle ... puis choisir une règle de type Port -> TCP et saisir dans Ports locaux spécifiques la valeur 22)
    • Fermer la fenêtre de configuration des fonctions avancées de sécurité
    Configuration du pare-feu de la Box
    Pour la configuration du pare-feu de la Box (pour moi il s'agit d'une BBox Bouygues Telecom) il faut passer par l'interface du routeur qui est donc spécifique au fournisseur d'accès. Si vous êtes chez FREE, SFR ou autre, le principe reste le même. L'idée ici est de rediriger les requêtes que la Box reçoit sur un port donné vers ma machine (appartenant au sous-réseau) contenant le serveur SSH et le proxy HTTP. Bref, rien de bien sorcier, voici ci-dessous la procédure.
    • Se connecter à l'interface d'administration du routeur de la BBox (http://192.168.1.254/)
    • Sur la partie gauche, choisir le menu Configuration Avancée -> Configuration du routeur
    • Choisir l'onglet NAT/PAT
    • Se connecter via le compte administrateur
    • Choisir la règle SSH Server - Secure Shell et modifier la de telle sorte que l'IP de la machine contenant le serveur SSH soit correcte (dans mon cas il s'agit de 192.168.1.6)
    • Valider et vérifier que la règle a été ajoutée comme montrée sur la capture d'écran ci-dessous

    Client
    Du côté client, normalement pas sur le même sous réseau que la partie serveur, nous avons à installer un client SSH et à configurer le navigateur Web. Il est bien évident que le port 22 du protocole SSH doit être ouvert, sinon la manipulation ne va pas être possible.

    Putty
    Putty est un client Telnet et SSH qui offre de très nombreux paramétrages. Il est disponible en téléchargement sur le site suivant (http://www.chiark.greenend.org.uk/~sgtatham/putty/). Je vous décris ci-dessous le paramétrage nécessaire.
    • Ouvrir le menu Session, vous devriez obtenir la capture d'écran ci-dessous

    • Dans la zone de texte Host Name (or IP address), saisir l'IP attribuée à votre Box. Cette information est connue depuis l'accueil de l'interface administration de votre BBox (http://192.168.1.254/) au niveau de la section Internet.
    • Ouvrir le menu Connection -> SSH -> Tunnels pour configurer les informations de votre futur Tunnel SSH (voir capture d'écran ci-dessous)
    • Nous souhaitons indiquer ici qu'à la sortie du Tunnel SSH, les requêtes devront être redirigées vers l'IP 192.168.1.6 du port 8118. Cette adresse est l'IP local de mon serveur contenant le serveur SSH et Proxy.
    • Revenir dans le menu Session puis donner un nom à cette configuration (exemple : Serveur SSH/Proxy) puis faire Save.
    • Finalement, faire Open pour se connecter au serveur SSH.
    • Si tout a été correctement configuré côté serveur, la connexion vers le serveur SSH doit fonctionner. Une authentification est requise vers un compte Windows contenant le serveur SSH (voir capture d'écran ci-dessous)
    • La connexion SSH vous permet de vous déplacer dans l'arborescence de votre compte distant. Pour utiliser en tunnel, vous devez uniquement laisser cette connexion ouverte.
    Configuration du navigateur Web
    Cette étape est la plus simple mais il faut faire attention à ne pas se tromper dans l'adressage du Proxy HTTP. Ici, le proxy HTTP est accessible via l'IP 127.0.0.1:8118 qui est l'entrée du tunnel.
    • Ouvrir votre navigateur préféré (ici ça sera FireFox 5)
    • Depuis le menu ouvrir la boîte de dialogue des options (Outils -> Options).
    • Sélectionner l'onglet Avancé et le sous onglet Réseau, puis faire apparaître les paramètres de connexion (bouton Paramètres)
    • Sélectionner Configuration manuelle du proxy et saisir dans la zone Proxy HTTP la valeur 127.0.0.1 et dans la zone Port la valeur 8118 (voir capture d'écran ci-dessous)
    • Faire OK
    Normalement tout devrait fonctionner. Toutes requêtes HTTP passent par votre tunnel SSH. Vous pouvez surfer en toute sécurité.

    Il est possible d'aller plus loin comme par exemple la mise en place d'un VPN. Pour cela, la toile propose de nombreux tutoriels qui vous faciliteront la vie.

    samedi, juillet 16, 2011

    Prises de responsabilités chez Developpez.com

    Pour vous avertir si vous le ne saviez pas, j'ai pris la responsabilité de la rubrique Eclipse et la responsabilité de la rubrique Java conjointement avec mlny84. Cette implication a été motivée car les principales forces de la rubrique Eclipse et Java ont quitté Developpez.com (merci à Eric Siber [Ricky81] sur son importante implication à la rubrique Java). Par ailleurs Developpez.com reste un média non négligeable pour la diffusion d'information autour des technologies Java (tutoriels, FAQ, forums, ...). Pour preuve, même si j'arrive à attirer pas mal de personne via mon blog, mes supports de cours sur Developpez.com sont très visités (moi de juin ~ 8000 visites).

    Du côté de la rubrique Java et sous rubriques associées (Spring, Android, Eclipse, Netbeans, Spring, ...) de nombreuses personnes passionnées et motivées sont là pour donner de leur temps afin de faire vivre la communauté francophone Java.

    Si vous êtes intéressés par un investissement dans une sous rubrique Java de Developpez.com (écriture articles, modération, écriture FAQ, ...), n'hésitez pas à nous contacter.

    Liens pratiques de la semaine

    Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.

    Eclipse
    Java
    Divers
    • Un billet qui décrit les bénéfices de la gestion de sources avec GIT
    • Un billet qui décrit les 10 commandes de base pour utiliser GIT
    • Dans la série GIT, je voudrais l'installation cliente sous Windows

    mercredi, juin 22, 2011

    Eclipse Indigo est sorti

    Tous les ans et pratiquement à la même période une nouvelle version d'Eclipse est rendue disponible. Cette année la nouvelle version porte le nom d'Indigo.

    Pour télécharger cette nouvelle version veuillez vous rendre sur le site de la communauté Eclipse (http://www.eclipse.org/downloads/).

    Quoi de neuf dans cette version ?
    • EGIT1.0 (un client pour GIT)
    • WindowBuilder (un outil de construction d'IHMs)
    • M2E (le client Maven)
    • et plus de 62 projets qui ont été mis à jour
    La prochaine version s'appellera Eclipse Juno est sortira dans un an.

    samedi, juin 11, 2011

    Emmanuel Bernard au JUG Poitou-Charentes pour présenter Hibernate Search et HibernateOGM

    Jeudi dernier (9 juin 2011) avait lieu la dernière session du JUG Poitou-Charentes avant la pause estivale. Nous avons eu droit pour cette occasion à deux excellentes présentations données par Emmanuel Bernard de JBoss sur Hibernate Search et Hibernate OGM.

    Hibernate Search est une API qui s'ajoute à Hibernate permettant de faire de la recherche fulltext sur le contenu de la base de données. Cette API s'appuie sur Apache Lucene pour réaliser l'indexation du contenu. Emmanuel s'est attaché, avec brio, à expliquer comment ajouter les fonctionnalités de Hibernate Search dans un développement existant (nouvelles annotations spécifiques). La simplicité d'interrogation avec une API adaptée pour la recherche a été montrée. Cette dernière a montré sans aucun doute que des recherches complexes peuvent être menées en toute simplicité. Parfois, je me demandais même si je ne pouvais pas remplacer certaines des mes requêtes complexes HQL/JPQL par ce mécanisme de recherche.

    Hibernate OGM présenté en second m'a tout simplement bluffé tant l'idée est simple et efficace. Vous prenez actuellement toutes les solutions NoSQL du marché et vous vous retrouvez avec quatre familles distinctes (clé/valeur, orientées colonnes, orientées documents et graphes). Seulement le problème c'est que vous avez une API différente pour chacune, un langage de requête spécifique. Bref, pour manipuler ces bases c'est galère et sans compter l'apprentissage nécessaire. L'objectif d'Hibernate OGM (Object Grid Mapper) offre une implémentation JPA (manipulation d'object et requêtes JP-QL) tout en stockant et requêtant les données d'une grille clé/valeur. Ainsi, il offre une API familière tout en permettant de bénéficier des possibilités de scalabilité des solutions NoSQL. Hibernate OGM inclus notamment de supporter des applications JPA existantes.

    Lors de la présentation il s'est attardé à montrer comment on pouvait représenter les données objets dans une représentation verticale clé/valeur. Toutes les modélisations (associations simples et multiples) y sont passées. Pour l'instant ça se limite à la solution NoSQL InfiniteSpan (BD Grille en mémoire). Toutefois des dialectes pour d'autres solutions et familles sont prévus.

    Actuellement Hibernate OGM est encore en phase de prototype (version alpha). Toutefois Emmanuel s'est avancé à préciser une date de sortie pour la release prévue pour la fin d'année.

    D'autres solutions du même type
    Comme j'ai été séduit par cette solution, je vous propose prochainement un billet pour débuter avec Hibernate OGM et j'espère qu'au fur et à mesure de l'évolution de la bibliothèque étoffer par d'autres billets. Une autre cible pour la série des J'ai besoin ... d'utiliser Hibernate OGM.

    JUG Summer CAMP 2011 à La Rochelle le 16 Septembre 2011

    Le JUG Poitou-Charentes organise le vendredi 16 septembre 2011, la deuxième session du JUG Summer CAMP. Une journée gratuite de conférences Java. Cet événement francophone se déroulera à La Rochelle à l'espace Espace Encan tout près de l'aquarium.

    De nombreuses acteurs du monde de l'Open Source seront présentées pour animer les différentes sessions de la journée.

    La Rochelle est à 2 heures de Paris et le lieu de l'événement est à deux pas de la gare TGV de La Rochelle. En plus c'est un vendredi veille de Week-End dans un cadre magnifique.

    J'y serai et j'espère vous y retrouver pour discuter entre passionnés

    Le site de l'événement est disponible à cette adresse : http://sites.google.com/site/jugsummercamp/

    Supports de cours sur Slideshare

    J'ai déposé l'intégralité des supports de cours (Java EE, Java SE, Eclipse, SOA) sur la plateforme d'hébergement de transparents Slideshare.

    Mon compte sur slideshare est le suivant : http://www.slideshare.net/baronm

    Tous les billets de ce blog qui annoncent un support de cours ont été mis à jour pour afficher la présentation.

    J'espère que ce nouveau moyen de diffusion vous aidera à parcourir plus facilement mes supports de cours.

    vendredi, mai 27, 2011

    Liens pratiques de la semaine

    Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.

    Eclipse
    Java
    • Avec Java 7 il sera possible d'utiliser des "Hooks" sur les répertoires systèmes pour écouter les éventuels changement. Ce billet explique comment mettre cela en place via WatchService.
    Divers
    • Un retour d'expérience sur GIT assez sympathique (lien)

    jeudi, mai 19, 2011

    J'ai besoin ... d'utiliser Tycho - Partie 5 : Construction d'un product Eclipse

    Je reviens dans la série des J'ai besoin ... d'utiliser Tycho pour vous décrire cette fois-ci comment construire automatiquement un product Eclipse avec Maven 3 et son plugin Tycho.

    Pour rappel, il y a presque un an j'expliquais dans un billet comment construire automatiquement un bundle OSGi à partir d'un entrepôt p2. Depuis tout ce temps que s'est-il passé ? Tycho a évolué, de nombreux billets d'explication sont apparues sur la toile, des projets sont passés à Tycho et finalement Tycho est devenu un projet de la fondation Eclipse. Par conséquent de nombreuses sources d'inspiration sont à disposition.

    De nombreux problèmes sur la manière d'utiliser Tycho ont été résolus via le tutoriel proposé à l'EclipseCON 2011. C'est pour cette raison que la première partie de ce billet se veut être une mise à jour des précédents billets relatifs à Tycho.

    Pré-requis logiciel
    Au niveau des pré-requis logiciel pour rejouer cet atelier veuillez installer les outils suivants :
    marrer Eclipse en choisissant un nouveau Workspace et configurer le plugin M2Eclipse de façon à pointer sur le bon fichier settings.xml.

    Création d'un projet Agrégateur
    (keulkeul.tychorcpdemo.aggregator)
    Ce projet Agrégateur aura comme seul but de contenir tous les sous projets (plugins, feature, tests, repository p2, ...). Du point de vue Maven il s'agira de décrire dans le fichier pom.xml tous les sous modules.

    Veuillez suivre la démarche ci-dessous :
    • Ouvrir l'assistant de création de projet File -> New -> Other ...
    • Choisir l'élément Maven Project de la catégorie Maven, l'écran ci-dessous doit apparaître
    • Cocher l'option Create a simple project (skip archetype selection), puis faire Next
    • Dans le champ de texte Group Id saisir la valeur tychorcpdemo
    • Dans le champ de texte Artifact Id saisir la valeur keulkeul.tychorcpdemo.aggregator
    • Au niveau de la sélection Packaging sélectionnez la valeur pom puis faire Finish
    Un nouveau projet Maven sera créé contenant un fichier pom.xml. Nous modifierons ce fichier à chaque fois que nous ajouterons un nouveau module.

    Création du plugin RCP (keulkeul.tychorcpdemo.rcp)
    Ce plugin est particulier dans le sens où il s'agit d'un Rich Client Application ce qui signifie qu'il peut être utilisé seul. Comme l'idée n'est pas d'apprendre à créer un plugin RCP nous utiliserons un exemple patron.
    • Ouvrir l'assistant de création de projet File -> New -> Other ...
    • Choisir l'élément Plug-in Project depuis la catégorie Plug-in Development, puis faire Next. L'écran ci-dessous doit apparaître
    • Dans le champ Project Name saisir la valeur keulkeul.tychorcpdemo.rcp
    • Décocher l'option Use default location
    • Créer un répertoire keulkeul.tychorcpdemo.rcp à la racine du répertoire du projet agrégateur créé précédemment, puis faire Next. L'écran suivant doit apparaître
    • Cocher la case Would you like to create a rich client application ? puis faire Next. L'écran suivant doit apparaître.
    • Choisir comme patron RCP application with a view puis faire Next. L'écran suivant doit apparaître.
    • Dans le champ Application window title saisir la valeur Keulkeul Tycho RCP Demo Application
    • Sélectionner l'option Add branding ce qui permettra d'être identifié comme un product lors de la création de la configuration d'exécution, puis faire Finish
    Un nouveau projet keulkeul.tychorcpdemo.rcp vient d'être créé. Pour s'assurer que ce plugin RCP fonctionne nous allons créer une configuration d'exécution.
    • Ouvrir l'écran de création des configurations. Depuis le menu principal Run -> Run Configurations ... L'écran suivant doit apparaitre.
    • Créer une nouvelle configuration de type Eclipse Application dont le nom sera TychoRCPDemo
    • Choisir depuis Run a product la valeur keulkeul.tychorcpdemo.rcp.product (uniquement disponible si vous aviez coché l'option Add branding. Sélectionner l'onglet Plug-ins et vous devriez obtenir l'écran suivant
    • Choisir depuis Launch with la valeur plug-ins selected below only
    • Décocher tous les plugins présents depuis le noeud racine Target Platform
    • Sélectionner uniquement le plugin keulkeul.tychorcpdemo.rcp depuis le nœud racine Workspace
    • Cliquer sur Add Required Plug-ins pour ajouter uniquement les plugins requis à l'exécution de ce plugin RCP.
    • Faire Run. Vous devriez obtenir l'écran suivant :
    • Ajouter un nouveau fichier Maven pom.xml à la racine de ce projet (keulkeul.tychorcpdemo.rcp) dont le contenu est le suivant :
    <project>
    <modelversion>4.0.0</modelversion>
    <parent>
    <groupid>tychorcpdemo</groupid>
    <artifactid>keulkeul.tychorcpdemo.parent</artifactid>
    <version>1.0.0-SNAPSHOT</version>
    <relativepath>../keulkeul.tychorcpdemo.parent/pom.xml</relativepath>
    </parent>
    <groupid>tychorcpdemo</groupid>
    <artifactid>keulkeul.tychorcpdemo.rcp</artifactid>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>eclipse-plugin</packaging>
    </project>
    • Comme vous pouvez le constatez ce fichier pom.xml fait référence à un pom.xml parent que nous définirons plus tard. Intéressons-nous avant à ajouter le projet keulkeul.tychorcpdemo.rcp comme module au projet keulkeul.tychorcpdemo.aggregator. Par conséquent modifier le fichier pom.xml du projet keulkeul.tychorcpdemo.aggregator de cette manière :
    <project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>tychorcpdemo</groupId>
    <artifactId>keulkeul.tychorcpdemo.aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
    <module>keulkeul.tychorcpdemo.parent</module>
    <module>keulkeul.tychorcpdemo.rcp</module>
    </modules>
    </project>
    • De même nous profitons de cette modification pour ajouter un autre module keulkeul.tychorcpdemo.parent
    Création d'un projet parent (keulkeul.tychorcpdemo.parent)
    Le projet parent a pour objectif de contenir toutes les configurations propres à Tycho dont tous les plugins auront besoin. Il contiendra également les liens vers les entrepôts p2.

    La démarche de création de ce projet est identique à celle utilisée pour créer le projet keulkeul.tychorcpdemo.aggregator à la différence que ce projet doit être placé à la racine du projet agrégateur. Pour les valeurs à donner dans le nouveau fichier pom.xml, suivre les indications données ci-dessous :
    • Dans le champ de texte Group Id saisir la valeur tychorcpdemo
    • Dans le champ de texte Artifact Id saisir la valeur keulkeul.tychorcpdemo.parent
    • Au niveau de la sélection Packaging sélectionnez la valeur pom puis faire Finish
    • Compléter le fichier pom.xml généré par les informations liées à la configuration de Tycho
    <project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>tychorcpdemo</groupId>
    <artifactId>keulkeul.tychorcpdemo.parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
    <tycho-version>0.11.0</tycho-version>
    </properties>

    <repositories>
    <!-- configure p2 repository to resolve against -->
    <repository>
    <id>helios</id>
    <layout>p2</layout>
    <url>http://download.eclipse.org/releases/helios/</url>
    </repository>
    </repositories>
    <build>
    <plugins>
    <plugin>
    <!-- enable tycho build extension -->
    <groupId>org.sonatype.tycho</groupId>
    <artifactId>tycho-maven-plugin</artifactId>
    <version>${tycho-version}</version>
    <extensions>true</extensions>
    </plugin>
    </plugins>
    </build>
    </project>
    A ce stade vous devriez obtenir la structure de fichiers suivante :
    keulkeul.tychorcpdemo.aggregator \-
    pom.xml
    keulkeul.tychorcpdemo.parent \-
    pom.xml
    keulkeul.tychorcpdemo.rcp \-
    src \-
    pom.xml
    Démarrer une construction du projet via Maven
    Ouvrir l'invite de commandes de Windows et se placer à la racine du répertoire parent. Saisir la ligne de commande ci-dessous :

    mvn clean install

    Normalement si tout se passe bien vous devriez obtenir le message suivant :

    Création d'un projet feature (keulkeul.tychorcpdemo.feature)
    Ce projet de type feature va nous permettre de regrouper dans une feature l'ensemble des plugins de notre application. Il faut admettre que pour l'instant il y en a pas énormément. L'idée est que si vous souhaitez ajouter de nouveaux plugins, vous n'aurez qu'à modifier cette feature.
    • Ouvrir l'assistant de création de projet File -> New -> Other ...
    • Choisir l'élément Feature Project depuis la catégorie Plug-in Development, puis faire Next. L'écran ci-dessous doit apparaître
    • Choisir comme nom de projet keulkeul.tychorcpdemo.feature
    • Personnaliser le répertoire de travail pour être à la racine du projet keulkeul.tychorcpdemo.aggregator
    • Choisir depuis la liste des plugins disponibles (Initialize from the plug-ins list) le plugin keulkeul.tychorcpdemo.rcp puis faire Finish
    Un nouveau projet keulkeul.tychorcpdemo.feature vient d'être créé.
    • Ajouter un nouveau fichier Maven pom.xml à la racine de ce projet dont le contenu est le suivant :
    <project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
    <groupId>tychorcpdemo</groupId>
    <artifactId>keulkeul.tychorcpdemo.parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../keulkeul.tychorcpdemo.parent/pom.xml</relativePath>
    </parent>
    <groupId>tychorcpdemo</groupId>
    <artifactId>keulkeul.tychorcpdemo.feature</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>eclipse-feature</packaging>
    </project>
    • Ajouter ce nouveau projet comme module en complétant le pom.xml du projet keulkeul.tychorcpdemo.aggregator
    • Vérifier que l'application se construit correctement via un mvn clean install
    Création d'un projet update site (keulkeul.tychorcpdemo.repository)
    Nous attaquons maintenant la partie intéressante de ce billet. A ce stade rien de nouveau par rapport aux autres billets hormis peut être la ré-organisation des différents plugins. Ce nouveau projet a but de créer un update site de notre projet. Cela permettra ainsi d'utiliser l'outil de mise à jour pour installer nos nouveaux plugins.
    • Ouvrir l'assistant de création de projet File -> New -> Other ...
    • Choisir l'élément Plug-in Project depuis la catégorie Plug-in Development, puis faire Next. L'écran ci-dessous doit apparaître
    • Choisir comme nom de projet keulkeul.tychorcpdemo.repository
    • Personnaliser le répertoire de travail pour être à la racine du projet keulkeul.tychorcpdemo.aggregator
    • Cocher l'option Generate a web page listing all available features within the site puis faire Finish
    • Depuis le nouveau projet généré, renommer le fichier site.xml en category.xml
    • Ouvrir le fichier site.xml et depuis l'onglet Site Map créer une catégorie une nouvelle catégorie appelée TychoRCPDemo
    • Depuis cette nouvelle catégorie ajouter la feature keulkeul.tychorcpdemo.feature créée précédemment (voir capture d'écran ci-dessous)
    • Ajouter un nouveau fichier Maven pom.xml à la racine de ce projet dont le contenu est le suivant :
    <project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
    <groupId>tychorcpdemo</groupId>
    <artifactId>keulkeul.tychorcpdemo.parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../keulkeul.tychorcpdemo.parent/pom.xml</relativePath>
    </parent>
    <groupId>tychorcpdemo</groupId>
    <artifactId>fr.ensma.lisi.tychorcpdemo.repository</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>eclipse-repository</packaging>
    </project>
    • Ajouter ce nouveau projet comme module en complétant le pom.xml du projet keulkeul.tychorcpdemo.aggregator
    • Vérifier que l'application se construit correctement via un mvn clean install
    Création d'un fichier product (keulkeul.tychorcpdemo.repository)
    Le fichier product contient toutes les informations relatives à la construction d'un exécutable Eclipse (plateformes supportées, le splashscreen, le nom de l'application, les images, ...).
    • Ouvrir l'assistant de création de projet File -> New -> Other ...
    • Choisir l'élément Product Configuration depuis la catégorie Plug-in Development, puis faire Next. L'écran ci-dessous doit apparaître
    • Choisir le projet keulkeul.tychorcpdemo.repository
    • Saisir la valeur tychorcpdemo.product dans le champ File name
    • Choisir pour l'option Use a launch configuration la valeur TychoRCPDemo puis faire Finish
    • Éditer en mode texte le fichier tychorcpdemo.product (sans l'éditeur de configuration de product) et ajouter les instructions suivantes qui permettront de démarrer les plugins adéquates au lancement de l'application RCP
    <configurations>
    <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
    <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
    <plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
    </configurations>
    • Depuis l'onglet Overview du mode édition du fichier tychorcpdemo.product, saisir la valeur TychoRCPDemo.product
    • Modifier l'option The Product configuration is based on par la valeur features
    • S'assurer que la valeur keulkeul.tychorcpdemo.rcp.product est sélectionnée pour l'option Product et que la valeur keulkeul.tychorcpdemo.rcp.application est sélectionnée pour l'option Application. Voir capture d'écran ci-dessous :
    • Depuis l'onglet Dependencies choisir la valeur keulkeul.tychorcpdemo.feature. Voir capture d'écran ci-dessous :
    • Pour construire un product Eclipse selon un environnement donné (OS/WS/Arch) compléter le fichier pom.xml du projet keulkeul.tychorcpdemo.repository comme présenté ci-dessous :
     <build>
    <plugins>
    <plugin>
    <groupId>org.sonatype.tycho</groupId>
    <artifactId>tycho-p2-director-plugin</artifactId>
    <version>${tycho-version}</version>
    <executions>
    <execution>
    <id>materialize-products</id>
    <goals>
    <goal>materialize-products</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
    </project>
    Finalement depuis le projet feature (keulkeul.tychorcpdemo.feature) il nous reste à ajouter le fragment SWT correspondant à la plateforme Windows de façon à construire le product pour cette plateforme.
    • Ouvrir le fichier feature.xml et afficher l'onglet Plug-ins
    • Ajouter la feature org.eclipse.swt.win32.win32.x86 et définir la valeur win32 dans le champ Operating Systems, la valeur win32 dans le champ Window Systems et la valeur x86 dans le champ Architecture. Voir capture d'écran ci-dessous pour voir le résultat attendu :
    • Vérifier que l'application se construit correctement via un mvn clean install. Depuis le répertoire keulkeul.tychorcpdemo.repository/target/products/TychoRCPDemo.product/win32/win32/x86 vous devriez obtenir le résultat de cette construction. Un product Eclipse construit automatiquement à l'aide de Maven/Tycho.
    A suivre
    L'ensemble des sources de ce billet est disponible à cette adresse.

    Dans le prochain billet, je montrerai différents paramétrages concernant le product Eclipse, comment utiliser différents entrepôts p2, comment construire un product Eclipse pour différentes plateformes, ...