2010-03-28 19 views
3

Je vais avoir du mal à suivre this guide à « extraire » mes interfaces et les entités de mon oreille pour les utiliser dans une autre application Web:Fractionnement et des interfaces dans EJB module séparé - le déploiement ne parvient

  • J'utilise NetBeans 6.8 et Glassfish 3.0.1
  • "Java Class Library" projet
    • contient toutes les entités et les interfaces
  • "Java EE Application" projet
    • bibliothèque de classes ajoutée au projet, est emballé dans l'oreille
    • contient des implémentations EJB, BDM, Test
  • "Java Web Application" projet
    • bibliothèque de classes ajoutée au projet, est empaquetée dans le WAR
    • contient l'interface REST

Lorsque je compile et déploie l'application Web, tout se passe bien. Lorsque je compile l'application Java EE, je peux voir le fichier jar (interfaces, entités) inclus. Mais lorsque je tente de déployer l'AER, Glassfish il refuse avec une erreur java.lang.NoClassDefFoundError:

[#|2010-03-28T18:25:59.875+0200|WARNING|glassfishv3.0|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: mvs/core/StoreServiceLocal|#] 

[#|2010-03-28T18:25:59.876+0200|SEVERE|glassfishv3.0|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=28;_ThreadName=Thread-1;|Exception while deploying the app 
java.lang.IllegalArgumentException: Invalid ejb jar [CoreServer]: it contains zero ejb. 
Note: 
1. A valid ejb jar requires at least one session, entity (1.x/2.x style), or message-driven bean. 
2. EJB3+ entity beans (@Entity) are POJOs and please package them as library jar. 
3. If the jar file contains valid EJBs which are annotated with EJB component level annotations (@Stateless, @Stateful, @MessageDriven, @Singleton), please check server.log to see whether the annotations were processed properly. 

« mvs/core/StoreServiceLocal » est une interface qui est définie dans le fichier jar de bibliothèque.

Qu'est-ce que je fais mal?

J'utilise les annotations EJB3, donc il n'y a pas descripteur de déploiement spécifique haricot:

mvs/core/ShopperService.java:

@Stateless 
public class ShopperService implements ShopperServiceLocal, ShopperServiceRemote { 
} 

mvs/core/ShopperServiceLocal.java:

@Local 
public interface ShopperServiceLocal { 
} 
+0

Le fichier manifeste du fichier JAR (META-INF/ejb-jar.xml) contient-il des références à vos classes de beans? –

+0

@Achim: J'utilise EJB3, donc pas de descripteurs de déploiement. J'ai mis à jour mon message en conséquence. Pensez-vous que je devrais utiliser un descripteur de déploiement à la place? – Hank

+0

Les annotations sont correctes. Je voulais juste vérifier s'il y a peut-être un conflit. –

Répondre

4

Votre projet "Application Java EE" doit contenir les interfaces (qui ne peuvent actuellement pas être chargées au moment de l'exécution, d'où le NoClassDefFoundError). Et si vous souhaitez appeler les EJB à partir d'une autre application Web, créez un fichier "client" supplémentaire (avec les interfaces uniquement).

+0

Ok merci. Donc, le défi est seulement de garder le pot "client" en synchronisation, non? Chaque fois que j'apporte des modifications aux interfaces ou aux entités, je dois à nouveau les exporter dans le fichier client. – Hank

+0

@Hank Oui. La meilleure pratique consiste à produire ce client ejb-jar dans le cadre d'une construction automatisée (en utilisant Maven ou Ant). Cela résout le problème de synchronisation. –

+0

merci c'est ce que je pensais. Aide fantastique! – Hank

1

Je ne suis pas sûr de la structure détaillée de votre fichier EAR que vous avez énuméré ci-dessus. 'Dans' le fichier EAR doit contenir un fichier WAR (pour le conteneur Web) et un autre fichier JAR contenant votre EJB (pour le conteneur EJB). Les deux doivent connaître les interfaces EJB car leurs conteneurs appropriés ont des chargeurs de classe distincts. Si vous n'avez pas besoin d'une fonctionnalité EJB complète, EJB Lite (fourni avec EJB 3.1) vous permet de créer un fichier WAR dans lequel vous pouvez placer les deux. Ce fichier WAR peut contenir vos EJB et servlets, par exemple. Cela vous facilite le déploiement avec un seul fichier WAR. Mais EJB Lite n'est utile que si vos EJB n'ont pas besoin d'interfaces distantes.

Si vous avez besoin d'interfaces distantes pour vos EJB, un fichier EAR est la bonne solution. Ce fichier EAR doit contenir un fichier WAR à des fins Web et un fichier JAR pour vos définitions EJB.