2010-10-14 2 views
3

Jusqu'à maintenant, nous utilisions WAS 6.1 pour déployer nos applications Web. Nous devons maintenant migrer vers une solution Tomcat + OpenEJB économique. Le conteneur OpenEJB 3.1.2 est branché sur Tomcat 6.18, pas de serveur OpenEJB autonome ici.EJBs 2.0 sur OpenEJB - Où dois-je mettre les bocaux nécessaires?

Donc ici, je suis, en train de déployer mes objets EJB 2.1 dans OpenEJB ...

Mon problème est que le code exige que les bibliothèques EJBs .jar externes, et je ne sais pas où les mettre de telle sorte que ils sont réellement pris en compte dans le classpath du conteneur. Cela fonctionne très bien dans catalina.home/lib, donc dans openejb.home/lib. Mais je préférerais trouver un moyen d'empaqueter les EJB afin qu'ils soient facilement déployables avec leur .jar déposé directement en place pour être utilisé par le conteneur OpenEJB.

Cela peut inclure la construction d'un .ear ou d'un .jar avec les bons fichiers descripteurs ... Toute solution qui fonctionne est assez bonne pour moi.

Peut-être que quelqu'un peut vous aider?

+0

Je pense que tomcat_home/lib est le chemin à parcourir pour éviter les problèmes de classloader. Voir http://usna86-techbits.blogspot.com/2009/12/tomcat-openejb-and-jersey-oh-my.html – JoseK

+0

@JoseK Je pense que ce problème particulier était lié à l'inclusion de bibliothèques javax dans la webapp. La plupart d'entre elles sont ajoutées via le fichier javaee-api fourni avec OpenEJB. D'autres libs de tiers devraient être bien. Certainement laissez-moi savoir si vous avez vécu autrement. –

Répondre

4

approche oreille

Vous pouvez simplement le déposer dans le webapps Tomcat/et il sera ramassé.

Exemple oreille (valide):

myapplication.ear 
    lib/ 
    lib/libraryOne.jar 
    lib/libraryTwo.jar 
    redEjbs.jar 
    blueEjbs.jar 

erreur commune (invalide):

myapplication.ear 
    libraryOne.jar (err. not a javaee module) 
    libraryTwo.jar (err. not a javaee module) 
    redEjbs.jar 
    blueEjbs.jar 

Seuls les modules Java EE sont autorisés à la racine. Il s'agit des fichiers jar d'EJB, des fichiers .war, des fichiers .rar Connector et des fichiers Application Client jars. Avant Java EE 5, les bibliothèques devaient être explicitement listées dans un fichier application.xml. Java EE 5 et vers l'avant ils peuvent être ajoutés à un répertoire lib/et être compris comme étant des fichiers JAR simples par opposition à un module Java EE.

approche Effondré EAR

Dans OpenEJB/Tomcat, vous pouvez mettre toutes vos bibliothèques dans le fichier de guerre et être libre du concept de l'oreille. Ce fait maintenant partie de Java EE 6.

mywebapp.war 
    WEB-INF/lib/libraryOne.jar 
    WEB-INF/lib/libraryTwo.jar 
    WEB-INF/lib/redEjbs.jar 
    WEB-INF/lib/blueEjbs.jar 

erreur commune, y compris les spécifications:

mywebapp.war 
    WEB-INF/lib/javax.ejb.jar (err. clashes with the related system library) 
    WEB-INF/lib/libraryOne.jar 
    WEB-INF/lib/libraryTwo.jar 
    WEB-INF/lib/redEjbs.jar 
    WEB-INF/lib/blueEjbs.jar 

ne ressemble pas à c'est la question, mais en ajoutant à l'exhaustivité.

erreur commune, dépendances cassées:

tomcat/lib/libraryTwo.jar 

mywebapp.war 
    WEB-INF/lib/libraryOne.jar 
    WEB-INF/lib/redEjbs.jar 
    WEB-INF/lib/blueEjbs.jar 

Ce qui précède n'est pas invalide du point de vue de la spécification et il est impossible pour le serveur de détecter, mais peut conduire à des applications ne se charge pas correctement. Si libraryTwo.jar a besoin de classes dans libraryOne.jar, cette application ne fonctionnera jamais car le classloader Tomcat "lib" ne peut pas voir les classes du chargeur de classe "webapp", donc les classes de libraryTwo.jar ne seront jamais chargées avec succès. Malheureusement, le MV ne dira presque jamais la classe qui manquait et rapportera à la place le premier cours de la série d'événements qui conduirait à avoir besoin d'une classe qui manquait. C'est presque toujours une classe de bean ou de servlet.

+0

havent essayé mais ça sonne bien. +1 – JoseK

+0

Nope, ne fonctionnera pas ... Mon EJB repose sur une classe qui est dans un autre .jar. J'ai essayé de mettre ce .jar dans plusieurs endroits sans chance: à la racine de .ear, dans la racine de .war, dans le dossier WEB-INF/lib de .war ... Quand je lance le Tomcat serveur je continue à avoir que 'java.lang.NoClassDefFoundError: Impossible de charger complètement la classe: eu.partecis.proxya.ejb.autorisation.UcAutorisationBean en raison de: EvtAutorisationRechercheBean dans classLoader: (yadayada)' exception. – Julian

+0

Mettre des bibliothèques tierces à la racine d'une oreille ou d'une guerre n'est pas valide. Le WEB-INF/lib aurait dû fonctionner à condition que votre jarre ejb soit dans le même répertoire WEB-INF/lib. Prolongera la réponse pour montrer quelques exemples hypothétiques. Si vous pouviez développer la question pour montrer tous les pots avec lesquels vous travaillez, ce serait formidable. –

0

Merci David. J'ai essayé tout ce qui précède, mais toujours pas de chance. L'approche EAR effondré ne fonctionnerait pas pour moi, je suppose, pour autant que je sache que Tomcat 6.0.18 n'est pas conforme aux spécifications J2EE 6. Peut-être que je me trompe, mais j'ai essayé et ça n'a pas marché de toute façon. Donc, retour à l'approche EAR standard.

Mon EAR est organisé exactement comme décrit dans votre tout premier exemple. Un pot Ejb, deux fichiers de bibliothèque dans/lib, et c'est tout. Tomcat ne peut toujours pas instancier mon EJB car la classe EJB se rapporte à une classe inaccessible de Library Jar Two.

I simplifié mon fichier application.xml pour qu'il déclare un seul EJB unique:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ...> 
<application> 
    <display-name>ProxyaEAR</display-name> 
    <module id="EjbModule"> 
    <ejb>ProxyaEJB.jar</ejb> 
    </module> 
</application> 

Toutes les autres pensées ??

+0

Les exemples de l'autre article ne comportaient pas de descripteur. Si vous avez un descripteur alors vous devez lister tous vos jars explicitement avec myLibrary.jar pour chaque bibliothèque tierce. –

Questions connexes