2010-03-24 14 views
10

Je dois me connecter à une instance MongoDB depuis mon application EJB3, en cours d'exécution sur glassfish 3.0.1. Le projet Mongo fournit un ensemble de pilotes et je suis capable de les utiliser dans une application Java autonome.Comment utiliser des bibliothèques tierces dans glassfish?

Comment les utiliser dans une application Java EE? Ou peut-être un meilleur phrasé: comment est-ce que je devrais rendre une bibliothèque de tiers disponible à mon application quand elle s'exécute dans un récipient d'EJB?

En ce moment, je suis d'obtenir un java.lang.NoClassDefFoundError lors du déploiement d'un haricot qui tente d'importer de la bibliothèque:

[#|2010-03-24T11:42:15.164+0100|SEVERE|glassfishv3.0|global|_ThreadID=28;_ThreadName=Thread-1;|Class [ com/mongodb/DBObject ] not found. Error while loading [ class mvs.core.LocationCacheService ]|#] 
[#|2010-03-24T11:42:15.164+0100|WARNING|glassfishv3.0|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: com/mongodb/DBObject|#] 

[#|2010-03-24T11:42:15.259+0100|SEVERE|glassfishv3.0|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=28;_ThreadName=Thread-1;|Exception while loading the app 
org.glassfish.deployment.common.DeploymentException: java.lang.NoClassDefFoundError: com/mongodb/DBObject 
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:171) 
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:125) 
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:224) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:338) 

J'ai essayé d'ajouter au projet NetBeans (Propriétés -> Bibliothèques -> Compiler -> Ajouter un pot, activer 'Paquet'), et j'ai aussi essayé de copier manuellement le fichier jar dans $ GF_HOME/glassfish/domains/domain1/lib (où le connecteur mysql se trouve déjà).

Dois-je «enregistrer» la bibliothèque avec le conteneur? Référencez-le via Annotation? Étendre le chemin de classe du conteneur pour inclure la bibliothèque?

Répondre

17

Hmm ... Ne devriez-vous pas mettre ce "pilote" dans glassfishv3/glassfish/domains/domain1/lib/ext?

+0

@Pascal: merci! Je pensais que j'avais essayé cela aussi. Quoi qu'il en soit, fonctionne comme un charme. Est-ce un bon moyen cependant? Cela ne devrait-il pas faire partie du déploiement? – Hank

+1

@Hank Je ne sais pas comment le pilote MongoDB est utilisé, mais s'il n'est pas utilisé par le conteneur (comme un pilote JDBC serait de créer un pool de connexion) ni partagé entre les applications du domaine, alors vous devriez peut-être package à l'intérieur de votre application. –

9

Vous pouvez mettre des bibliothèques partagées à lib/ext de votre domaine. Les pilotes commons-logging et jdbc sont souvent ajoutés dans ce chemin de domaine.

Chargeur commun Classe

GlassFish v2 a une classe hiérarchie Loader bien définie qui identifie le chargeur de classe commune comme la bonne façon pour traiter les bibliothèques partagées. Donc à faire une longue histoire courte, vous mettant bibliothèques et d'autres cadres JAR dans domaines/domain1/lib est tout ce que vous devez faire faire.

lib/non lib/ext

La personne qui me pose la question avait essayé de mettre les bibliothèques dans domaines/domain1/lib/ext qui a déclenché une intéressante ClassNotFoundError pour le noyau des classes Java EE telles comme javax.servlet.http.HttpServlet. Shing Wai Chan n'a pas tardé à expliquer que domaines/domain1/lib/ext fait partie de -Djava.ext.dirs qui fait l'une de ses JARs être considéré comme une extension qui signifie JDK cadres d'applications web placé il y aura chargé avant classes d'implémentation webcontainer comme ils sont plus haut dans la chaîne de délégation classloader .

+0

Avez-vous essayé ce qui précède avec GlassFish v3? –

+0

va essayer glassfish3 dès que possible, mais pas encore :) http://blogs.sun.com/alexismp/entry/glassfish_equivalent_to_websphere_s –

+0

Cela fonctionne également avec GlassFish v3/3.1. J'ai mis mon pilote PGSQL dans glassfish/lib pour mes dernières installations et cela fonctionne sans configuration supplémentaire. – SplinterReality

3

Glassfish a sa propre hiérarchie de chargeur de classes, http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
je fais face au même problème dans mon projet, puis je mets toutes mes bibliothèques de tiers dans le domaine/domain1/lib et mon problème résolu. D'un autre côté, mon problème a été résolu aussi en mettant des bibliothèques dans glassfish/lib.

2

Dans mon cas, j'utilisais Oracle Express Edition 11gR2 et Glassfish 3.1.2 et la seule façon qui fonctionne dans mon cas était en train de la ojdbc6 dans:

C:\Program Files\glassfish-3.1.2.2\glassfish\lib 
0

Essayez de mettre votre libs en $ GF_HOME/GlassFish/modules /. C'est sale, mais ça marchera.