2008-11-28 7 views
10

Así que comencé con un proyecto de servicios web (solo un proyecto web dinámico) que crea y depura correctamente desde eclipse. Hemos extraído un fragmento de código común que queremos colocar en una biblioteca compartida, por lo que ahora esas clases van a un proyecto jar separado al que hace referencia el proyecto web.Problema de ruta de clase de tiempo de depuración de Eclipse: ¿cómo se incluye la salida de un proyecto dependiente en el classpath en tiempo de ejecución de un proyecto web?

En el proyecto web, hice Project-> Properties-> Java Build Path-> Projects-> Add y agregué el proyecto jar. Y esto solucionó correctamente todos los problemas de classpath en tiempo de compilación y todo funciona bien. Pero en el tiempo de ejecución, cuando el servidor tomcat se activa, Spring intenta inyectar algunas de las clases contenidas en el archivo jar y obtengo un NoClassDefFoundError.

Mis archivos .class y de propiedades y el contenido de mi directorio META-INF se muestran en el directorio ./build, pero mi directorio WEB-INF/lib parece estar referenciado in situ, y la dependencia jar no se usa no se copie para mostrarlo como parte de la Biblioteca de aplicaciones web.

¿Cuál es el encantamiento mágico para decirle al eclipse que el otro proyecto jar debe estar disponible para tomcat en tiempo de ejecución? Desde nuestro script de compilación ant, primero construimos el otro proyecto en WEB-INF/lib y todo funciona bien, pero no para la depuración de eclipse.

Respuesta

9

Las dependencias de los módulos Java EE resolverían este problema. Ya ha realizado la tarea de extraer sus clases comunes en su propio proyecto, posiblemente porque otros proyectos dependen de estas clases. De cualquier manera, deberá asegurarse de que se trata de un proyecto de utilidad (aparece en Java EE en los asistentes del proyecto) y no solo de un proyecto Java simple. Una vez hecho, puede proceder a agregar el proyecto de utilidad a su ruta de compilación (ruta en tiempo de compilación) tal como lo ha averiguado.

El paso adicional (final) es establecer una dependencia del módulo Java EE entre su proyecto web dinámico y la biblioteca compartida, lo que hace que las clases de la utilidad se ubiquen en WEB-INF \ lib durante el despliegue e incluso durante la exportación de la guerra. Para hacerlo, visite las propiedades del proyecto web dinámico y busque las dependencias del módulo Java EE. Asegúrese de que su proyecto de utilidad esté seleccionado aquí. Volver a implementar/publicar su aplicación y debería estar listo para comenzar.

+0

Eso parece haber hecho el truco, pero no estoy seguro de lo que está diciendo acerca de que sea un proyecto de "utilidad". ¿Hay algo que pueda ver en mi archivo .project o en .settings/que me permita saber si era del tipo correcto? –

+0

Los proyectos de utilidad son proyectos de Java, aunque son más aptos para el contexto de J2EE. Representan su código (no los archivos JAR de terceros) que se comparten en varios proyectos en su aplicación Enterprise. Por lo general, estas son clases utilizadas en múltiples EJB y, a menudo, un solo módulo web. –

+0

Normalmente no ubico proyectos de utilidad en proyectos simples de Java, porque los proyectos de utilidad tendrán los JAR de tiempo de ejecución del Servidor automáticamente agregados al classpath. Por ejemplo, podría utilizar datasources del mismo proyecto sin agregar los JAR del contenedor a la ruta de compilación. –

10

Me di cuenta de esto después de pasar algo de tiempo en él. Si se encuentra en Eclipse Helios, vaya al properties > deployment assembly > add > project y seleccione el proyecto dependiente que desea agregar.

+0

Más respuesta correcta y útil si no está usando un EAR. –

Cuestiones relacionadas