2012-01-19 20 views
5

Estoy en el proceso de actualización de Tomcat 6.0.24 a 7.0.23. Tengo un proyecto maven 2.2.1 que precompila JSP utilizando el plugin jspc maven.JSP en Tomcat 7 falla con NoClassDefFoundError: Lorg/apache/AnnotationProcessor

Cuando desplegar el archivo WAR para mi aplicación, y trato de visitar una página JSP, me sale el siguiente error:

javax.servlet.ServletException: Error instantiating servlet class org.apache.jsp.my_jsp 
... 
root cause: 
java.lang.NoClassDefFoundError: Lorg/apache/AnnotationProcessor; 
    java.lang.Class.getDeclaredFields0(Native Method) 
    java.lang.Class.privateGetDeclaredFields(Class.java:2291) 
    java.lang.Class.getDeclaredFields(Class.java:1743) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
... 

He tratado de tomar prestado un fragmento del POM de this blog post para hacer el trabajo jspc con Tomcat 7, pero esto no ha solucionado el problema. ¿Cómo puedo abordar este problema? Cualquier indicador en la dirección correcta sería apreciado.

Respuesta

5

Resulta que tenía otra referencia al complemento JSPC en un archivo POM de subdirectorio (myproject-war/pom.xml). Repararlo en /pom.xml y myproject-war/pom.xml fue suficiente para resolver el problema. Aquí está el fragmento de POM actualizado utilicé:

 <plugin> 
      <groupId>org.codehaus.mojo.jspc</groupId> 
      <artifactId>jspc-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>jspc</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <inputWebXml>${basedir}/target/web.xml</inputWebXml> 
       <packageName>org.apache.jsp</packageName> 
       <source>1.5</source> 
       <target>1.5</target> 
       <trimSpaces>false</trimSpaces> 
      </configuration> 
      <dependencies> 
       <dependency> 
        <groupId>com.csc.aims</groupId> 
        <artifactId>aims-jar</artifactId> 
        <version>${project.version}</version> 
        <classifier>${env}</classifier> 
       </dependency> 
       <!-- 
        Hack the jspc plugin, which only supports Tomcat 6, to work for Tomcat 7. See: 
        http://hasini-gunasinghe.blogspot.com/2011/09/how-to-use-pre-compiled-jsps-in-webapp.html 
       --> 
       <dependency> 
        <groupId>org.codehaus.mojo.jspc</groupId> 
        <artifactId>jspc-compiler-tomcat6</artifactId> 
        <version>2.0-alpha-3</version> 

        <exclusions> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jasper</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jasper-el</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jasper-jdt</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>servlet-api</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>jsp-api</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>el-api</artifactId> 
         </exclusion> 
         <exclusion> 
          <groupId>org.apache.tomcat</groupId> 
          <artifactId>annotations-api</artifactId> 
         </exclusion> 
        </exclusions> 
       </dependency> 

       <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>${tomcat.version}</version> 
       </dependency> 

       <dependency> 
        <groupId>org.eclipse.jdt.core.compiler</groupId> 
        <artifactId>ecj</artifactId> 
        <version>3.5.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

Además, he tenido que actualizar mi Tomcat proporciona dependencias, ya que el artifactId de cada dependencia Tomcat ha cambiado en la nueva versión; por ejemplo:

   <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jasper</artifactId> 
        <version>${tomcat.version}</version> 
        <scope>provided</scope> 
       </dependency> 

en lugar de:

   <dependency> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>jasper</artifactId> 
        <version>${tomcat.version}</version> 
        <scope>provided</scope> 
       </dependency> 

(Nota: tomcat.version es propiedad definida en mi POM principal):

<properties> 
    ... 
    <tomcat.version>7.0.23</tomcat.version> 
    ... 
</properties> 
+0

Tal vez no lo entiendo, pero ¿cuál es el propósito de tener tomcat-jasper en su ruta de clase y ese buch de exclusión en el plugin jspc? – Zarathustra

0

Parece que no está incluyendo un jar requerido en su classpath.

http://www.jarfinder.com/index.php/java/info/org.apache.AnnotationProcessor

enlace de arriba muestra que el archivo jar tiene la clase en ella y veo que está en catalina-6 * .jar así que estoy conjeturando que esto se elimina/desaprobado/modificada en Tomcat 7.

Puede intentar incluir este archivo jar en su classpath (lo cual no es una buena idea al mismo tiempo) ya que puede crear otros conflictos o afectar la portabilidad de sus aplicaciones.

+0

Acepto, parece que incluir archivos de biblioteca de Tomcat 6 podría resolver el problema como un enfoque provisional; pero, no quiero seguir ese curso a menos que no encuentre otra solución. Quiero averiguar la forma "correcta" de compilar JSP para Tomcat 7 ... suponiendo que ese es el origen del problema. – RMorrisey

1

que tenían el mismo problema porque EvalTag.jar necesitaba org.apache.AnnotationProcessor para ejecutar

Mi solución simple era recrear la interfaz directamente en mi aplicación ion. De esa forma no necesito todo el jasper.jar de tomcat 6.

package org.apache; 
import java.lang.reflect.InvocationTargetException; 
import javax.naming.NamingException; 

public interface AnnotationProcessor { 
    public void postConstruct(Object instance) throws IllegalAccessException, InvocationTargetException; 
    public void preDestroy(Object instance) throws IllegalAccessException, InvocationTargetException; 
    public void processAnnotations(Object instance) throws IllegalAccessException, InvocationTargetException, NamingException; 
}