Overblog
Suivre ce blog
Editer l'article Administration Créer mon blog

Publié par

Encore un sujet ininteressant pour la majorité d’entre vous…. mais qui ravira tous les développeurs qui cherchent de l’information à propos de la mise en place d’un environnement de développement d’EJB3 sous Eclipse (mac os) avec JBoss.

J’ai trouvé des fragments d’informations à droite à gauche sur le net, et je me suis dit que j’allais compiler ici tout ce que j’ai fait pour que ca marche sous Mac Os X. Je risque de le modifier selon les retours des utilisateurs… N’hesitez pas à commenter pour améliorer ce billet.

Java 6 on OS X

D’abord, il vous faudra peut être télécharger “Java 6 update” depuis le site Apple (via google)

Une fois installée, Java 6 ne sera pas votre JRE par défaut. C’est normal et c’est mieux ainsi. :)

Malloxbook:bin Mallox$ java -version

java version “1.5.0_16”

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)

Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)

J’ai pas particulèrement besoin de Java 6 mais j’ai rencontré des soucis qd j’ai tenté de lancer Jboss 5.0 avec la JVM par défaut (1.5 dans mon cas).

JBoss 5.1.0

Au début, j’étais parti avec la version 5.0.1.GA mais, plus tard dans le tuto, j’ai rencontré un souci avec cette version de Jboss lors du déploiement de mes EJBs. Apparement, il s’agirait d’un bug connu (cf http://www.jboss.org/index.html?module=bb&op=viewtopic&t=147843). Alors comme ca avait l’air de marcher avec une version précédente de Jboss, je suis parti avec la version 4.2.2.GA.

Finalement, le bug que j’avais avec la version 5.0.1 etait du au fait que la version 5 est plus exigeante au niveau de la syntaxe des EJB, et le code du tutoriel que j’utilisais pour tester le déploiement sous JBoss n’etait pas compatible 5.0.

J’ai donc téléchargé la version 5.1.0.

  1. Télecharger Jboss 5.1.0.GA sur  http://www.jboss.org/jbossas/downloads/
  2. Dézipper JBoss qqpart - par exemple dans /usr/local. Moi j’ai dézippé dans /usr/local/jboss-5.1.0.GA
  3. Pour lancer JBoss avec la bonne VM, j’ai mis en place ce petit script pour un lancement fait-maison de JBoss. Créer un fichier .sh avec le contenu ci dessous et mettez les droits d’excutiton (chmod). N’oubliez pas de changer le chemin de JBOSS_HOME si vous l’avez mis ailleurs:
#!/bin/bash

## Ensure that environment is set up appropriately

export JAVA_VERSION=1.6

export PATH=/System/Library/Frameworks/JavaVM.framework/Versions/$JAVA_VERSION/Home/bin:$PATH

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/$JAVA_VERSION/Home

export JBOSS_HOME=/usr/local/jboss-5.1.0.GA

cd $JBOSS_HOME

case $1 in

    start ) $JBOSS_HOME/bin/run.sh ;;

    stop  ) $JBOSS_HOME/bin/shutdown.sh -S;;

    *     ) echo "$0: unknown argument ‘$1′, should be start or stop." ;;

esac

cd -

En gros, ca fait ceci:

  1. set le path pour utiliser Java 6
  2. set JAVA_HOME et JBOSS_HOME (utilisés par JBoss)
  3. lance le script startup (or shutdown) de JBoss normal
  4. revient au répertoire de départ

Moi j’ai mis ce script dans /usr/local/jboss-5.1.0.GA/bin/jboss16.sh.
Dorénavant pour démarrer le serveur, ce sera depuis le Terminal : ./jboss16.sh start (stop pour l’arrêter)

MySQL

J’ai dejà une base de données MySQL sur ma machine. Elle provient de l’installation de MAMP (google). Faites comme moi, installer MAMP et n’oubliez pas que dans ce cas, on y accède par défaut via localhost:8889.

Télécharger la librairie mysql-connector-java-5.1.6-bin.jar et mettez la dans le répertoire /usr/local/jboss-5.1.0.GA/server/default/lib
Rédemarrer Jboss.

Eclipse

J’ai installé Eclipse Ganymede, avec les WTP Tools (installé ensuite via le menu “Help->software update” d’Eclipse. Ca va permettre, entre autre, d’être capable de créer un “EJB Project” dans Eclipse.

Déclaration du serveur JBoss dans WTP

Pour associer le serveur JBoss à WTP nous allons procéder de la même façon que pour un serveur Tomcat  :

- Ouvrir la page de préférences Préférences->Serveur->Environnements d’exécution installés.
- Dans la liste proposée par le bouton ‘Ajouter…‘, sélectionner le type de serveur ‘JBoss v4.0‘.
- Dans la page suivante de l’assistant, indiquer l’emplacement du serveur JBoss, par exemple /usr/local/jboss-5.1.0.GA

- Ouvrir la perspective J2EE et sélectionner la vue ‘Serveurs‘.
- Utiliser le menu contextuel : ‘Création->Serveur‘.
- Vérifier que le type de serveur sélectionné est ‘JBoss v5.0‘ et cliquer sur ‘Terminer‘ pour demander la création du serveur.

Une fois ces étapes de configuration effectuées, tester le bon fonctionnement du serveur en demandant son exécution à partir de la vue ‘Serveurs‘.

Code

Je me suis appuyé sur le tuto http://www.laliluna.de/ejb-3-tutorial-jboss.html pour la suite.

Récupérer les sources du tuto ici : http://www.laliluna.de/download/first-ejb3-tutorial.zip
Importez les sources que vous venez de télécharger dans un nouveau projet EJB. Utiliser le menu contextuel de la vue ‘Explorateur de projets’ pour créer un projet EJB :

Dans le zip du tutorial, il y a les EJB et le client Java pour les tester. 

Pour que le test s’exécute correctement plus tard (sans une erreur ClassNotFound de JBossProxy à l’éxecution), il faut d’emblée ajouter une External Library au build path de votre projet : jboss-ejb3-client.jar qui se trouve dans /usr/local/jboss-5.1.0.GA/client

Profitez en pour configurer pour que la projet compile en Java 1.6 (JRE Library)

Vous devriez avoir un truc dans le genre ci dessus. Tout devrait compiler direct.

Configuration de la Datasource

Ouvrir le fichier persistence.xml qui se trouve dans META-INF. Ajoutez la ligne en gras suivante :

<?xml version=”1.0” encoding=”UTF-8”?>
<persistence version=”1.0” xmlns=”http://java.sun.com/xml/ns/persistence” xmlnssi=”http://www.w3.org/2001/XMLSchema-instance”>
  <persistence-unit name=”FirstEjb3Tutorial”>
    <jta-data-source>java:/ejb3ExampleDS</jta-data-source>
    <properties>
      <property name=”hibernate.dialect” value=”org.hibernate.dialect.MySQLDialect”/>
      <property name=”hibernate.hbm2ddl.auto” value=”create-drop”/>
    </properties>
  </persistence-unit>
</persistence>

Dans Book.java, il faut modifier une propriété qui n’est pas compatible avec MySQL. Modifier la ligne en gras suivante :

Remplacer
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “book_sequence”)
    public Integer getId() {
        return id;
    }
Par
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = “book_sequence”)
    public Integer getId() {
        return id;
    }

Créer un fichier nommé “cequevousvoulez-ds.xml” (attention à la convention, gardez le texte en gras). Il y a des exemples de différents fichiers de conf en fonction des bases de données dans JBOSS_HOME/docs/examples/jca.
Mettre ce fichier dans /usr/local/jboss-5.1.0.GA/server/default/deploy

Un fichier datasource pour MySQL ressemble à ça (remplacer le gras par vos trucs) :

<datasources>
  <local-tx-datasource>
    <jndi-name>ejb3ExampleDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:8889/testdb</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>web1</user-name>
    <password>web1</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <!– should only be used on drivers after 3.22.1 with “ping” support
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
    –>
    <!– sql to call when connection is created
    <new-connection-sql>some arbitrary sql</new-connection-sql>
      –>
    <!– sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
    <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
      –>

    <!– corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) –>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

Déploiement

Etant donné que je lance JBoss en ligne de commande, je n’ai pas trouvé de moyen d’intégrer le déploiement des EJB directement dans Eclipse. Ce que je fais, c’est clic droit sur le projet, Export -> EJB JAR File.
Là je choisis Target Runtime Jboss 5.0 et la destination directement dans le répertoire des déploiements de JBoss
(voyez ci dessous le champ Destination est /usr/local/jboss-5.1.0.GA/server/default/deploy/…)

Lancement

Au premier démarrage, l’appli instancie la connexion à la base, et crée le schéma de base.

Voici ma sortie standard dans mon Terminal après avoir lancé JBoss :

………
17:28:06,167 WARN  [JmxKernelAbstraction] jboss.j2ee:jar=FirstEjb3Tutorial.jar,name=BookTestBean,service=EJB3 is not registered

17:28:06,167 INFO  [PersistenceUnitDeployment] Stopping persistence unit persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,167 INFO  [SessionFactoryImpl] closing
17:28:06,168 INFO  [SessionFactoryObjectFactory] Unbinding factory from JNDI name: persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,168 INFO  [NamingHelper] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
17:28:06,176 INFO  [SessionFactoryObjectFactory] Unbound factory from JNDI name: persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,176 INFO  [SchemaExport] Running hbm2ddl schema export
17:28:06,177 INFO  [SchemaExport] exporting generated schema to database
17:28:06,178 INFO  [SchemaExport] schema export complete
17:28:06,179 WARN  [JmxKernelAbstraction] persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial is not registered
17:28:06,206 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.entity.PersistenceUnitDeployment
17:28:06,206 INFO  [JmxKernelAbstraction] installing MBean: persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial with dependencies:
17:28:06,209 INFO  [JmxKernelAbstraction]     jboss.jca:name=ejb3ExampleDS,service=DataSourceBinding
17:28:06,211 INFO  [PersistenceUnitDeployment] Starting persistence unit persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,218 INFO  [Ejb3Configuration] found EJB3 Entity bean: de.laliluna.library.Book
17:28:06,221 INFO  [Configuration] Reading mappings from resource : META-INF/orm.xml
17:28:06,221 INFO  [Ejb3Configuration] [PersistenceUnit: FirstEjb3Tutorial] no META-INF/orm.xml found
17:28:06,222 INFO  [AnnotationBinder] Binding entity from annotated class: de.laliluna.library.Book
17:28:06,222 INFO  [EntityBinder] Bind entity de.laliluna.library.Book on table book
17:28:06,230 INFO  [ConnectionProviderFactory] Initializing connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
17:28:06,230 INFO  [InjectedDataSourceConnectionProvider] Using provided datasource
17:28:06,230 INFO  [SettingsFactory] RDBMS: MySQL, version: 5.0.19
17:28:06,230 INFO  [SettingsFactory] JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
17:28:06,234 INFO  [Dialect] Using dialect: org.hibernate.dialect.MySQLDialect
17:28:06,235 INFO  [TransactionFactoryFactory] Transaction strategy: org.hibernate.ejb.transaction.JoinableCMTTransactionFactory
17:28:06,235 INFO  [TransactionManagerLookupFactory] instantiating TransactionManagerLookup: org.hibernate.transaction.JBossTransactionManagerLookup
17:28:06,235 INFO  [TransactionManagerLookupFactory] instantiated TransactionManagerLookup
17:28:06,235 INFO  [SettingsFactory] Automatic flush during beforeCompletion(): disabled
17:28:06,235 INFO  [SettingsFactory] Automatic session close at end of transaction: disabled
17:28:06,236 INFO  [SettingsFactory] JDBC batch size: 15
17:28:06,236 INFO  [SettingsFactory] JDBC batch updates for versioned data: disabled
17:28:06,236 INFO  [SettingsFactory] Scrollable result sets: enabled
17:28:06,236 INFO  [SettingsFactory] JDBC3 getGeneratedKeys(): enabled
17:28:06,236 INFO  [SettingsFactory] Connection release mode: auto
17:28:06,236 INFO  [SettingsFactory] Maximum outer join fetch depth: 2
17:28:06,236 INFO  [SettingsFactory] Default batch fetch size: 1
17:28:06,236 INFO  [SettingsFactory] Generate SQL with comments: disabled
17:28:06,236 INFO  [SettingsFactory] Order SQL updates by primary key: disabled
17:28:06,237 INFO  [SettingsFactory] Order SQL inserts for batching: disabled
17:28:06,237 INFO  [SettingsFactory] Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
17:28:06,237 INFO  [ASTQueryTranslatorFactory] Using ASTQueryTranslatorFactory
17:28:06,237 INFO  [SettingsFactory] Query language substitutions: {}
17:28:06,237 INFO  [SettingsFactory] JPA-QL strict compliance: enabled
17:28:06,237 INFO  [SettingsFactory] Second-level cache: enabled
17:28:06,237 INFO  [SettingsFactory] Query cache: disabled
17:28:06,237 INFO  [SettingsFactory] Cache provider: org.hibernate.cache.HashtableCacheProvider
17:28:06,238 INFO  [SettingsFactory] Optimize cache for minimal puts: disabled
17:28:06,238 INFO  [SettingsFactory] Cache region prefix: FirstEjb3Tutorial_jar,FirstEjb3Tutorial
17:28:06,238 INFO  [SettingsFactory] Structured second-level cache entries: disabled
17:28:06,238 INFO  [SettingsFactory] Statistics: disabled
17:28:06,238 INFO  [SettingsFactory] Deleted entity synthetic identifier rollback: disabled
17:28:06,238 INFO  [SettingsFactory] Default entity-mode: pojo
17:28:06,238 INFO  [SettingsFactory] Named query checking : enabled
17:28:06,242 INFO  [SessionFactoryImpl] building session factory
17:28:06,250 INFO  [SessionFactoryObjectFactory] Factory name: persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,250 INFO  [NamingHelper] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
17:28:06,255 INFO  [SessionFactoryObjectFactory] Bound factory to JNDI name: persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,255 WARN  [SessionFactoryObjectFactory] InitialContext did not implement EventContext
17:28:06,257 INFO  [SchemaExport] Running hbm2ddl schema export
17:28:06,257 INFO  [SchemaExport] exporting generated schema to database
17:28:06,261 INFO  [SchemaExport] schema export complete
17:28:06,263 INFO  [NamingHelper] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces}
17:28:06,264 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
17:28:06,264 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=FirstEjb3Tutorial.jar,name=BookTestBean,service=EJB3 with dependencies:
17:28:06,265 INFO  [JmxKernelAbstraction]     persistence.units:jar=FirstEjb3Tutorial.jar,unitName=FirstEjb3Tutorial
17:28:06,272 INFO  [EJBContainer] STARTED EJB: de.laliluna.library.BookTestBean ejbName: BookTestBean
17:28:06,281 INFO  [EJB3Deployer] Deployed: file:/usr/local/jboss-5.1.0.GA/server/default/deploy/FirstEjb3Tutorial.jar

Tout est OK. On peut lancer la classe FirstEJB3TutorialClient.java (en mode “As a java application”).

Sortie standard de FirstEJB2TutorialClient :

17:29:33,020 DEBUG TimedSocketFactory:87 - createSocket, hostAddr: localhost/127.0.0.1, port: 1099, localAddr: null, localPort: 0, timeout: 0
17:29:33,472 DEBUG MicroSocketClientInvoker:278 - SocketClientInvoker[622209db, socket://127.0.0.1:3873] constructed
17:29:33,473 DEBUG MicroRemoteClientInvoker:283 - SocketClientInvoker[622209db, socket://127.0.0.1:3873] connecting
17:29:33,474 DEBUG MicroSocketClientInvoker:1011 - Creating semaphore with size 50
17:29:33,476 DEBUG MicroRemoteClientInvoker:297 - SocketClientInvoker[622209db, socket://127.0.0.1:3873] connected
17:29:33,498 DEBUG ClientSocketWrapper:164 - reset timeout: 0
17:29:34,120 DEBUG InvokerRegistry:628 - removed SocketClientInvoker[622209db, socket://127.0.0.1:3873] from registry
17:29:34,120 DEBUG MicroSocketClientInvoker:384 - SocketClientInvoker[622209db, socket://127.0.0.1:3873] disconnecting …
17:29:34,121 DEBUG SocketWrapper:127 - ClientSocketWrapper[Socket[addr=/127.0.0.1,port=3873,localport=60158].64d90254] closing socket
17:29:34,126 DEBUG SocketWrapper:129 - ClientSocketWrapper[Socket[addr=/127.0.0.1,port=3873,localport=60158].64d90254] closed socket

Et sur le terminal JBoss, vous devriez avoir ça :

17:29:33,879 INFO  [STDOUT] list some books
17:29:34,078 INFO  [STDOUT] Book: 1 Title My first bean book Author Mallox
17:29:34,078 INFO  [STDOUT] Book: 3 Title EJB 3 developer guide, comes soon Author Mallox
17:29:34,078 INFO  [STDOUT] List all books
17:29:34,084 INFO  [STDOUT] Book: 1 Title My first bean book Author Mallox
17:29:34,084 INFO  [STDOUT] Book: 2 Title another book Author Paul
17:29:34,084 INFO  [STDOUT] Book: 3 Title EJB 3 developer guide, comes soon Author Mallox
17:29:34,084 INFO  [STDOUT] delete a book
17:29:34,086 INFO  [STDOUT] List all books
17:29:34,107 INFO  [STDOUT] Book: 1 Title My first bean book Author Mallox
17:29:34,107 INFO  [STDOUT] Book: 3 Title EJB 3 developer guide, comes soon Author Mallox

Voilà. Il ne vous reste plus qu’à coder vos propres classes métiers.

Commenter cet article