2011-01-23 14 views
25

Me he topado con este problema varias veces y me he encontrado con una solución (semi) confiable, así que pensé en publicarla aquí en caso de que me ayude alguien más, o en caso de que lo olvide, y también para preguntar si alguien tiene alguna idea de cuál es la causa subyacente y por qué funciona mi solución.ClassNotFoundException DispatcherServlet al iniciar Tomcat (dependencias de Maven no copiadas en wtpwebapps)

El problema - Tengo una aplicación web Spring 3 que quiero usar la opción Ejecutar en el servidor en Eclipse para ejecutar en un servidor Tomcat 7. Con algunos proyectos, esto solo funciona, pero algunos parecen estar en un estado roto por el cual cada vez que el servidor se inicia obtengo una clase no encontrada: org.springframework.web.servlet.DispatcherServlet.

Después de algunas investigaciones descubrí que las dependencias de Maven del proyecto no habían sido copiados a WEB-INF/lib en ${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/

I probado un montón de cosas antes de finalmente darse cuenta de que el proyecto tenía una advertencia en el panel Problemas:

Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER 
will not be exported or published. Runtime ClassNotFoundExceptions may result. 

Quizás debería haberlo notado antes.

De todos modos, seleccionar esto y realizar la "Corrección rápida" soluciona el problema y puedo ejecutar mi proyecto felizmente. La solución rápida es: "Marcar la entrada asociada classpath sin procesar como una dependencia de publicación/exportación".

El problema es que, aunque esto funciona, no sé lo que significa. No puedo ver ningún cambio obvio en la configuración de mi proyecto una vez hecho. Me gustaría saber cuál es el problema real y si puedo evitar que vuelva a suceder. También me gustaría saber si hay algo que podría haber hecho yo mismo (aparte de realizar la solución rápida) que lo habría arreglado, porque siento que intenté casi todo lo demás.

Gracias por su ayuda.

Respuesta

34

Eche un vistazo a la sección "Ensamblaje de despliegue" debajo de las propiedades del proyecto. El contenido de esta página especifica cómo se ensamblará su proyecto en una aplicación en ejecución. En particular, este es el lugar donde puede controlar cuál de las bibliotecas a las que hace referencia su proyecto debe estar empaquetada con ella. Seleccione Agregar -> Entradas de ruta de compilación Java. Podrá elegir entre las entradas existentes de la ruta de compilación para incluirlas en el ensamblado.

La solución rápida que encontraste hizo lo mismo por ti. Si tiene curiosidad sobre lo que sucede debajo de las cubiertas, eche un vistazo a su archivo .classpath antes y después de la solución rápida. La solución rápida etiqueta la entrada classpath con cierta información de ensamblaje.

+0

Gracias! Me resulta imposible recordar cosas si no entiendo _cómo_ funciona, por lo que es probable que esto me ahorre mucho dolor en el futuro. – Russell

+0

Impresionante. Esto realmente me ayudó después de que mi Eclipse explotó repentinamente sin ninguna razón ayer. – fforw

2

archivo .class Comprobar y sustituir la siguiente entrada

**<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER" />** 

con continuación: -

**<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"> 
    <attributes> 
    <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/> 
    </attributes> 
</classpathentry>** 

Se trabajó para mí.

+0

Es poco probable que desee exportar todo el classpath de Maven, ya que esto probablemente genere conflictos en el servidor de aplicaciones que proporciona algunos jar por defecto (como por ejemplo servlet-api-2.5.jar, jsp-api-2.1.jar, jstl-1.2.jar). En su lugar, cada jar debe seleccionarse uno por uno en la sección Ensamblaje de despliegue de Eclipse como se menciona en la respuesta aceptada por Konstantin. – chrisjleu

+0

Para mí ya está presente, pero igual obtengo NoClassDefFoundError, pero cuando voy a la ubicación. metadata/.plugins/org.eclipse.wst.server.core/tmp0, no encuentro mi dependencia maven en Lib, ¿alguna pista? –

Cuestiones relacionadas