2010-03-24 14 views
10

Necesito conectarme a una instancia de MongoDB desde mi aplicación EJB3, que se ejecuta en glassfish 3.0.1. El proyecto Mongo proporciona un conjunto de controladores y puedo usarlos en una aplicación Java independiente.¿Cómo usar las bibliotecas de terceros en glassfish?

¿Cómo los usaría en una aplicación Java EE? O tal vez mejor redacción: ¿cómo podría hacer que una biblioteca de terceros esté disponible para mi aplicación cuando se ejecuta en un contenedor EJB?

Por el momento, me estoy poniendo un java.lang.NoClassDefFoundError al desplegar un bean que intentos de importación desde la biblioteca:

[#|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) 

He intentado añadir al proyecto de NetBeans (Propiedades -> Bibliotecas -> Compilar -> Agregar Jar, habilitar 'Paquete'), y también intenté manualmente copiar el archivo jar a $ GF_HOME/glassfish/domains/domain1/lib (donde ya reside el conector mysql).

¿Debo registrar la biblioteca con el contenedor? ¿Referenciarlo a través de Annotation? ¿Extender el classpath del contenedor para incluir la biblioteca?

Respuesta

17

Hmm ... ¿No debería poner este "controlador" en glassfishv3/glassfish/domains/domain1/lib/ext?

+0

@Pascal: ¡gracias! Pensé que había intentado esto, también. De todos modos, funciona como un encanto. Aunque es una buena manera? ¿No debería ser esto parte de la implementación? – Hank

+1

@Hank No sé cómo se usa el controlador MongoDB, pero si el contenedor no lo usa (como un controlador JDBC sería para crear un grupo de conexiones) ni se comparte entre las aplicaciones del dominio, entonces quizás deba empaquetar dentro de tu aplicación. –

9

Puede poner libs compartidas en lib/ext de su dominio. los controladores common-logging y jdbc a menudo se agregan en esta ruta de dominio.

Clase del cargador común

GlassFish V2 tiene una jerarquía del cargador de clases bien definido que identifica el cargador de clases comunes como la forma correcta para hacer frente a las bibliotecas compartidas. Por lo tanto, para hacer una larga historia corta, ponerle bibliotecas y otras JAR marco en dominios/dominio1/lib es todo lo que necesita para do.

lib /, no ext lib/

La persona me hace la pregunta tenía intentado poner las bibliotecas en dominios/domain1/lib/ext cuales provocó una interesante ClassNotFoundError para el núcleo de Java EE clases tales como javax.servlet.http.HttpServlet. Shing Wai Chan fue rápido para explicar que dominios/domain1/lib/ext es parte de -Djava.ext.dirs que hace que cualquiera de sus JAR ser considerado como una extensión JDK que significa marcos de aplicaciones web coloca habrá cargados antes de clases de implementación webcontainer como están más arriba en la cadena de delegación de classloader .

+0

¿Has probado lo anterior con GlassFish v3? –

+0

intentará glassfish3 lo antes posible :) http://blogs.sun.com/alexismp/entry/glassfish_equivalent_to_websphere_s –

+0

Esto también funciona con GlassFish v3/3.1. Puse mi controlador PGSQL en glassfish/lib para mis últimas instalaciones y funciona sin ninguna configuración adicional. – SplinterReality

3

Glassfish tiene propia jerarquía del cargador de clases, http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
que se enfrentan al mismo problema en mi proyecto y entonces puse todas mis bibliotecas de terceros en el dominio/domain1/lib y mi problema resuelto. Por otro lado, mi problema también se resolvió colocando bibliotecas en glassfish/lib.

2

En mi caso estaba usando Oracle Express Edition 11gR2 y Glassfish 3.1.2 y la única manera de que funcione en mi caso estaba poniendo el ojdbc6 en:

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

Trate de poner sus bibliotecas en GF_HOME $/glassfish/modules /. Está sucio, pero funcionará.

Cuestiones relacionadas