Créer un projet Seam pour Tomcat 6 avec Eclipse et les JBoss Tools

MISE À JOUR du 20/10/2010
Les mises à jour sont indiquées par les balises [M] et [/M]

J’ai rencontré pas mal de difficultés à utiliser un truc pourtant en apparence tout bête : Créer un nouveau projet Seam configuré pour un serveur Tomcat 6 en utilisant la commande du plugin JBoss Tools pour Eclipse.
Voici le résumé des opérations à effectuer. J’en ferai un vrai tutoriel plus tard. Vos remarques et éventuelles erreurs que vous rencontreriez en suivant ces instructions me permettront d’améliorer le tutoriel car il est possible que j’oublie ici des manipulations que j’ai effectuées et pas ou mal notées.

Configuration de l’environnement de développement
Voici ce que j’ai installé :

  • Eclipse Galileo 3.5.2 ([M]j’ai été en échec avec la version Helios au boulot mais j’ai réussi à la maison[/M])
  • Plugins JBoss Tools 3.1 pour Eclipse (j’ai installé tout le paquet !)
  • Tomcat 6.0.29
  • [M]Jboos-Seam 2.2.0.GA

J’ai installé le Plugin Sysdeo Tomcat pour Eclipse au boulot mais ça m’a posé des problèmes de compatibilité avec la fonction serveur d’Eclipse qui s’est avérée plus pratique pour lancer les projets Seam. Je n’utilise plus Sysdeo.[/M]

Au fil de mes (més)aventures, j’ai vu qu’il me fallait aussi télécharger mojarra-1.2-14-FCS-binary.zip à décompresser dans le répertoire java (/usr/share/java sur ma Mandriva Linux 2010.0). [M]Finalement, ça ne semble pas utile car les jars nécessaires (jsf-api.jar et jsf-impl.jar) sont présent dans le répertoire lib de jboss-seam.[/M]

Enchaînement des opérations
Dans Eclipse, utiliser la commande de menu File / New / Seam Web Project.
Dans la fenêtre « Seam Web Project » :

  • Donnez un nom à votre projet ; j’utiliserai ici « projettest ».
  • Dans la liste « Target runtime », choisissez « Apache Tomcat v6.0″. S’il n’est pas encore configuré, vous pouvez l’ajouter à l’aide du bouton « New… ».
  • Dans « Dynamic web module version », j’ai laissé ce qui s’est affiché par défaut : 2.5.
  • Dans « Target Server », vous choisissez votre serveur Tomcat.
  • Dans « Configuration », choisissez « Default configuration for Apache Tomcat v6.0″. Vous verrez alors apparaître en haut de la fenêtre un message d’avertissement indiquant : « Seam facet must be enabled ». Et vous n’aurez plus accès qu’au bouton « Cancel », ce qui vous empêche de continuer à créer le projet. Pas de panique ! Cliquez sur le bouton « Modify… » en face de la liste déroulante de la configuration. Vous arrivez alors dans une fenêtre appelée « Project Facets« . Cochez « Java persistence », « JavaServer Faces » et « Seam », sauvegardez la configuration sous un nouveau nom et cliquez sur OK. Vous revenez alors sur la fenêtre « Seam Web Project » sans le message d’erreur et vous pouvez maintenant cliquer sur le bouton « Next > ».

Je n’ai rien modifié dans les fenêtres « Java » et « Web Module« , successivement affichées par le bouton « Next > ».

Sur la fenêtre « JPA Facet« , [M]choisissez la Platform « Hibernate ».
Créez une librairie (que vous pouvez appeler par exemple « Hibernate » et importez-y les fichiers hibernate*.jar + persistence-api.jar de la lib de jboss-seam, puis sélectionnez cette nouvelle librairie. [/M]
La case « Include libraries with this application » est cochée.
La Liste déroulante « Connection » correspond au choix de la connexion à la base de données. Si vous n’en avez défini encore aucune, vous pouvez la créer en cliquant sur le lien « Add connection… ». J’ai configuré une base MySQL appelée « test ».
J’ai coché la case « Add driver library to build path » et le driver « MySQL JDBC Driver » est apparu dans la liste déroulante.
Dans « Persistent class management », c’est l’option « Annotated classes must be listed in persistence.xml » qui est choisie.
L’option « Create orm.xml » est cochée [M](Ne semble pas utile)[/m].
Cliquez sur le bouton « Next > ».

Dans la fenêtre « JSF Capabalities« , [M]choisissez le type « User library ». Créez une librairie appelée par exemple seam-jsf et importez-y les fichiers jsf-api.jar et jsf-impl.jar puis sélectionnez cette librairie.
L’option « Include libraries with this application » est cochée. Sous Eclipse Helios, il y a un message d’alerte en haut de la fenêtre indiquant qu’il peut y avoir une incompatibilité avec le facet choisi.[M]
J’ai laissé les zones de saisie tel qu’elles ont été remplies par Eclipse.
Cliquez sur le bouton « Next > ».

Dans la fenêtre « Seam Facet« , choisissez le Seam Runtime « JBoss-seam-2.2.0.GA » ou ajoutez-le s’il n’est pas déjà dans la liste. Choisissez l’option de déploiement « WAR ». Pour la configuration de la Database, j’ai choisi « MySQL5 (InnoDB ) » et j’ai coché l’option « DB Tables already exists in database » puisque j’ai créé une table dans la BDD de test. J’ai coché l’option « Create test Project » mais cela ne semble pas obligatoire. Je crois d’ailleurs de mémoire qu’il faut aussi installer le plugin TestNG pour utiliser le projet de test mais je n’en suis pas encore à tester mon projet ! J’y reviendrai en temps utile.

Voilà ! On peut cliquer sur le bouton « Finish » et laisser Eclipse créer le projet tout seul !

Jusque là, rien de compliqué, à part la subtilité concernant la configuration par défaut pour Apache à laquelle il manque des facets. Sauf que si vous essayez de démarrer Tomcat et d’accéder sur un navigateur à la page d’accueil de votre projet, ça ne fonctionnera pas !

On va commencer par ajouter dans le répertoire projettest/WebContent/WEB-INF/lib un paquet de jar pour éviter plus tard une floppée de messages d’erreur indiquant que des classes ne sont pas trouvées. [M]J’ai essayé de créer une librairie en y mettant tous les jar de la lib de jboss-seam mais j’ai eu des messages d’erreur lors de la création du projet indiquant qu’il y avait plusieurs versions d’une classe.[/M] Ces jar sont disponibles dans le répertoire lib de jboss-seam. S’il vous en manque, vous pourrez les télécharger en cherchant sur Internet. Copiez les fichiers jars suivant et collez-les, directement à l’aide de « paste » du menu contextuel d’Eclipse, dans le répertoire du projet indiqué plus haut. Voici la liste des jars nécessaires pour éviter les messages d’erreur à rallonge de Java :

  • antlr.jar
  • commons-collections.jar
  • commons-loggin.jar
  • dom4j.jar
  • hibernate-annotations.jar
  • hibernate-commons-annotations.jar
  • hibernate-core.jar
  • hibernate-entitymanager.jar
  • hibernate-validator.jar
  • javassist.jar
  • jsf-impl.jar
  • jsf-api.jar
  • jta.jar
  • log4j.jar
  • lucene-core.jar
  • persistence-api.jar
  • slf4j-api.jar
  • slf4j-log4j12.jar

Créer un fichier « context.xml » dans projettest/WebContent/META-INF. Y insérer le code suivant :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>  
<Context crossContext="true"  
  debug="5"  
  docBase="projettest"  
  path="/projettest"  
  reloadable="true">  
  <Resource auth="Container"  
  driverClassName="com.mysql.jdbc.Driver"  
  maxActive="20"  
  maxIdle="10"  
  maxWait="-1"  
  name="jdbc/projettestDatasource"  
  type="javax.sql.DataSource"  
  url="jdbc:mysql://localhost:3306/test"  
  username="votre_utilisateur_mysql"  
  password="celui_du_username" />  
</Context>

Copier le tag « Ressource » ci-dessus dans (répertoire Tomcat)/conf/Catalina/localhost/projettest.xml, à l’intérieur du tag « Context ». Le fichier projettest.xml doit ressembler à ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Context path="/projettest"
        reloadable="true"
        docBase="/home/plemenager/workspace/projettest/WebContent"
        workDir="/home/plemenager/workspace/projettest/work" >
        <Logger className="org.apache.catalina.logger.SystemOutLogger"
                verbosity="4"
                timestamp="true"/>
        <Resource auth="Container"
                driverClassName="com.mysql.jdbc.Driver"
                maxActive="20"
                maxIdle="10"
                maxWait="-1"
                name="jdbc/projettestDatasource"
                type="javax.sql.DataSource"
                url="jdbc:mysql://localhost:3306/test"
                username="votre_utilisateur_mysql"
                password="celui_du_username" />
</Context>

Ouvrir le fichier /projettest/src/META-INF/persistence.xml. Dans le tag « persistence-unit », y ajouter le code nécessaire pour que le fichier complet ressemble à ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"  
  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_1_0.xsd"
>
  <persistence-unit name="projettest" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>  
    <non-jta-data-source>java:comp/env/jdbc/projettestDatasource</non-jta-data-source>  
    <properties>  
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />  
      <property name="hibernate.hbm2ddl.auto" value="update" />  
      <property name="hibernate.show_sql" value="true" />  
      <property name="hibernate.format_sql" value="true" />  
      <property name="hibernate.default_catalog" value="test"/>
    </properties>  
  </persistence-unit>
</persistence>

Ouvrez le fichier projettest/WebContent/components.xml. Supprimez les paramètres debug et jndi-pattern du tag « core:init » qui ne doit donc plus en contenir.
[M]Ajouter :

1
2
3
xmlns:transaction="http://jboss.com/products/seam/transaction"
http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd
<transaction:entity-transaction entity-manager="#{entityManager}"/>

Le début du fichier doit ressembler à ça :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
            xmlns:core="http://jboss.com/products/seam/core"
            xmlns:persistence="http://jboss.com/products/seam/persistence"
            xmlns:drools="http://jboss.com/products/seam/drools"
            xmlns:bpm="http://jboss.com/products/seam/bpm"
            xmlns:security="http://jboss.com/products/seam/security"
            xmlns:mail="http://jboss.com/products/seam/mail"
            xmlns:web="http://jboss.com/products/seam/web"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:transaction="http://jboss.com/products/seam/transaction"
            xsi:schemaLocation=
                "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
                 http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.2.xsd
                 http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.2.xsd
                 http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.2.xsd
                 http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
                 http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.2.xsd
                 http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.2.xsd
                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd
                 http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd">
 
   <core:init />
 
   <core:manager concurrent-request-timeout="500"
                 conversation-timeout="120000"
                 conversation-id-parameter="cid"
                 parent-conversation-id-parameter="pid"/>
 
   <transaction:entity-transaction entity-manager="#{entityManager}"/>

[/M]

Ouvrez le fichier projettest/WebContent/WEB-INF/pages.xml. Commentez le dernier tag « exception » tel que ci-dessous :

1
2
3
4
5
<!-- <exception>
        <redirect view-id="/error.xhtml">
            <message severity="error">Unexpected error, please try again</message>
        </redirect>
    </exception> -->

[M]Ouvrir le fichier projettest/WebContent/WEB-INF/web.xml et cliquer sur l’onglet Source.
Commenter la partie :

1
2
3
<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

Copier le fichier jboss-seam-2.2.0.GA/examples/jpa/resources-tomcat/WEB-INF/classes/logj4.xml dans projettest/WebContent/WEB-INF/classes/
[/M]

Si vous avez correctement fait tout cela, et si je n’ai rien oublié, vous pouvez maintenant démarrer Tomcat. Le seul problème restant à résoudre est un couple de WARN concernant log4j.

Allez dans votre navigateur préféré et lancez votre application, via le Tomcat Manager ou par une URL du type http://localhost:8080/projettest. Vous devriez alors voir apparaître un superbe : « Welcome to Seam!« 

Laisser un commentaire