Hello World (minimaliste & fonctionnel) sur Java EE – EJB3... Chiche !
http://en.wikipedia.org/wiki/Markdown
- Installer l'environnement technique (voir "Environnement technique") :
- JBoss 6
- Maven 3
- IntelliJ 11
- Obtenir les sources depuis Github :
- depuis un terminal :
git clone https://github.com/seiza/HelloJee.git - Copier le fichier
settings-sample.xml(à la racine de ce projet) dans votre répertoire~/.m2
- depuis un terminal :
- Si JBoss n'est pas installé dans le répertoire
/usr/local/jboss-6.1.0.Finalmodifier la property mavenjboss.homedans lepom.xmlracine - Exécuter
mvn clean packagedans un terminal (copie l'EAR dans le répertoire/usr/local/jboss-6.1.0.Final/server/default/deploy/si il existe !) - Lancer l'instance
defaultde JBoss - Lancer IntelliJ (http://www.jetbrains.com/idea/download/index.html), faire "Ouvrir un projet" et sélectionner le
pom.xmlracine - Voir la version concernée pour trouver la classe client à lancer (dans IntelliJ, une des classes du package
me.couvreur.java.hellojee.client)
Pour créer une nouvelle version (après avoir fait un commit des sources) : mvn release:prepare -Dresume=false
- 0.1 : EJB 3 Session Stateless : : Projet JEE minimaliste avec uniquement un EJB Stateless et un appel depuis une classe Java simple.
- 0.2 : EJB 3 MDB / JMS) : Ajout d'un Message Driven Bean
- 0.3 : EJB 3 JPA / Hibernate : Ajout de la persistance avec EJB 3 - JPA - Hibernate
- Voir sur Github :
- La branche 1-ejb3-stateless pour voir que les sources de cette partie.
- Le tag HelloJee-0.1.0 pour ne télécharger que les sources de cette partie
- Voir le tag HelloJee-0.1.0 pour ne télécharger que les sources de cette partie
Le minimum pour mettre en oeuvre un EJB :
- Un EJB session stateless (qui prend un paramètre String retourne une String concaténée)
- Un EAR encapsulant l'EJB à des fins de déploiement
- Un client qui se contente d'appeler l'EJB, de l'appeler et d'écrire le résultat sur la console (aucune autre technologie)
Il n'y a pas encore de JMS / MDB, de persistance ou d'application web.
- Exécuter
mvn clean packagedans un terminal (l'EAR est copié dans le répertoire/usr/local/jboss-6.1.0.Final/server/default/deploy/) - Dans IntelliJ exécuter la classe client
me.couvreur.java.hellojee.client.session.HelloSessionStatelessClientdu modulehellojee-client: vous devriez voir une trace intéressante ;)
Attention :
- Il va peut être falloir changer le port JNDI dans le fichier
hellojee-client/src/main/resources/jndi.propertiespour que cela fonctionne.
- Voir sur Github :
- La branche 2-ejb3-mdb-jms pour voir que les sources de cette partie.
- Le tag hellojee-0.2.0 pour ne télécharger que les sources de cette partie
- Voir le tag hellojee-0.2.0 pour ne télécharger que les sources de cette partie
Ajout d'un Message Driven Bean (MDB / JMS) :
- Dans le package
me.couvreur.java.hellojee.ejb.mdb. - Le Message Producer et le MDB fonctionnent avec une Queue.
- Mais impossible de faire fonctionner le Messager/Queue Receiver ;(
- Mise en place de la livraison via Maven :
mvn mvn release:prepareet 3 fois 'return' (utiliser les 3 propositions par défaut)
- Attention, dans JBoss, toutes les destinations de type Queue doivent commencer par
queue/(voir l'annotation@MessageDriven/@ActivationConfigPropertydans la classeme.couvreur.java.hellojee.ejb.mdb.HelloMessageListenerMDB) - Attention, dans JBoss, la déclaration des queues se fait dans un fichier
hornetq-jms.xml(et non pasjms.xml) dans le répertoire ressourceMETA-INFdu modulehellojee-ejb
- Exécuter
mvn clean packagedans un terminal (l'EAR est copié dans le répertoire/usr/local/jboss-6.1.0.Final/server/default/deploy/) - Dans IntelliJ exécuter la classe client
me.couvreur.java.hellojee.client.mdb.ClientHelloJMSProducerdu modulehellojee-client: vous devriez voir une trace intéressante dans les logs du serveur ;)
Attention :
- Il va peut être falloir changer le port JNDI dans le fichier
hellojee-client/src/main/resources/jndi.propertiespour que cela fonctionne.
- Voir sur Github :
- La branche 3-ejb3-entity-jpa pour voir que les sources de cette partie.
- Le tag hellojee-0.3.0 pour ne télécharger que les sources de cette partie
- Le tag hellojee-0.3.0 pour ne télécharger que les sources de cette partie
Ajout de la persistance (JPA / Hibernate) :
- Entity Beans
PersonversAddressdans le packageme.couvreur.java.hellojee.ejb.entity.modeldu modulehellojee-model(pour isoler le modèle de la persistance : plus facile à tester). - Tests unitaires
PersonTestetAddressTest(voir http://ejb3unit.sourceforge.net/Session-Bean.html) - Relation OneToMany de
PersonversAddress(voir l'annotation au dessus de la méthodePerson.getAdresses()pour la configuration clef). - L'EJB Session Stateless
AddressBookBeana été créé pour pouvoir accéder aux Entity Beans
- Utilisation d'une base de données dans la persistance (JPA / Hibernate) :
-
Création d'une branche Git sur le tag
hellojee-0.3 -
Configuration de la base de données HSQLDB intégrée à JBoss AS pour ajouter le DataSource
HelloJeeDS:- Création du fichiers projet
<hellojee-ejb>/META-INF/hellojee-ds.xmlpour définir lelocal-tx-datasource(plutôt que dans le fichierJBOSS_HOME/server/default/deploy/hsqldb-ds.xml) - Création du fichiers projet
<hellojee-ejb>/META-INF/hellojee-jboss-beans.xmlpour définir leapplication-policy(plutôt que dans le fichierJBOSS_HOME/server/default/conf/login-config.xml)
- Création du fichiers projet
-
Refactoring du fichier
<hellojee-ejb>/META-INF/persistence.xml(nommage correct du persistence unit et correction de sa configuration) -
Ajout de la configuration suivante au
truepom.xmldu modulehellojee-ejb: -
Configuration du plugin Maven
hibernate3-maven-plugindans lepom.xmldu modulehellojee-modelafin de pouvoir générer le schéma de base de données -
Correction de la dépendance
hibernate-entitymanagerdans lepom.xmldu modulehellojee-model:- Upgrade de la version utilisée à
3.4.0.GApour supprimer des erreurs au runtime liées à des conflits de version sur les dépendances transitives - Changement du
scopeàprovidedégalement pour éviter des erreurs au runtime liées à des collisions dans les libs utilisées.
- Upgrade de la version utilisée à
-
Ajout de la dépendance à
dom4jdans lepom.xmldu modulehellojee-ear.
- Création d'un EJB Stateless
- Ajout des annotations
@Statelesssur la classeAddressBookBean - Ajout des annotations
@PersistenceContext(unitName="HelloJeePU")sur l'attribut membreAddressBookBean.entityManagerafin de permettre l'injection sans equivoque.
- Création du client
- Création du package
me.couvreur.java.hellojee.client.entitydans le modulehellojee-client - Création de la classe
ClientAddressBookStatelessdedans pour appeler l'EJB Stateless et lui transmettre l'EJB EntityPersoncréé pour le persister.
PersonetAddress(les objets persistés) doivent implémenterSerializable(si utilisés comme Entity Bean et pas seulement serialisés).
- Exécuter
mvn clean packagedans un terminal (l'EAR est copié dans le répertoire/usr/local/jboss-6.1.0.Final/server/default/deploy/) - Dans IntelliJ exécuter la classe client
me.couvreur.java.hellojee.client.session.HelloSessionStatelessClientdu modulehellojee-client: vous devrier voir une trace interessante ;)
Attention :
- Il va peut être falloir changer le port JNDI dans le fichier
hellojee-client/src/main/resources/jndi.propertiespour que cela fonctionne.
- JBoss AS 6
- J'ai initialement commencé avec JBoss AS 7, mais trop de limitations et de bugs pour débuter
- Voir Installer JBoss AS 7 sur Mac (la procédure reste la même que pour la v6).
- Maven 3
- Les versions récentes de Mac OS X intègre Maven dans sa version 3
- Voir Installer Maven3 sur Mac
- IntelliJ 11 :
Voir aussi :
- Le paragraphe "Ecrire le projet 'from scratch'" pour plus de détails
- la page JavaEE sur mon wiki pour les détails d'installation.
mkdir ejb-gwt
cd ejb-gwt
gedit pom.xml
mvn archetype:create -DgroupId=me.couvreur.java -DartifactId=ejb-jar
cd ejb-jar/src/main
mkdir resources
cd resources
mkdir META-INF
cd META-INF
mate persistence.xml
Ajouter dans le settings.xml :
<profiles>
<profile>
<id>jboss-public-repository</id>
<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>
<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>
</profile>
</profiles>
Vous aurez alors l'erreur suivante :
[ERROR] Failed to execute goal on project ejb-jar: Could not resolve dependencies for project
me.couvreur.java.hellojee:ejb-jar:ejb:1.0-SNAPSHOT: Failed to collect dependencies for
[org.jboss.jbossas:jboss-as-client:pom:6.1.0.Final (provided), junit:junit:jar:4.7 (test)]:
Failed to read artifact descriptor for trove:trove:jar:2.1.1: Could not transfer artifact
trove:trove:pom:2.1.1 from/to jboss (http://repository.jboss.org/maven2): Access denied to:
http://repository.jboss.org/maven2/trove/trove/2.1.1/trove-2.1.1.pom, ReasonPhrase:Forbidden. -> [Help 1]
Ajouter dans le settings.xml :
<mirrors>
<mirror>
<id>deprecated-jboss-repo</id>
<name>Use new repo to handle requests to deprecated repo</name>
<mirrorOf>repository.jboss.org</mirrorOf>
<url>http://repository.jboss.org/nexus/content/repositories/deprecated</url>
</mirror>
<mirror>
<id>deprecated-jboss-repo2</id>
<name>Use new repo to handle requests to deprecated repo</name>
<mirrorOf>jboss</mirrorOf>
<url>http://repository.jboss.org/nexus/content/repositories/deprecated</url>
</mirror>
</mirrors>
Voir : Capture d’écran 2012-04-15 à 14.18.07.png
Créer le SDK dans IntelliJ : Project Settings > SDKs > [+]
Puis le selectionner : Project Settings > Modules > module-name > Dependencies > Module SDk : 1.6
Si vous avez l'erreur :
Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to
me.couvreur.java.hellojee.ejb.session.HelloSession
Alors il faut ajouter la librairie jbossall-client.jar (qui se trouve dans JBOSS_HOME/client) au projet IntelliJ hellojee-client.