2012-01-19 17 views
5

Sono in corso l'aggiornamento da Tomcat 6.0.24 a 7.0.23. Ho un progetto Maven 2.2.1 che precompila JSP usando il plugin jspc maven.JSP su Tomcat 7 non riesce con NoClassDefFoundError: Lorg/apache/AnnotationProcessor

Quando ho distribuire il file WAR per la mia app, e cerco di visitare un JSP, ottengo il seguente errore:

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) 
... 

ho provato prendendo in prestito un frammento del POM da this blog post a rendere il lavoro jspc con Tomcat 7, ma questo non ha risolto il problema. Come posso risolvere questo problema? Sarebbe gradito qualsiasi suggerimento nella giusta direzione.

risposta

5

Si scopre che avevo un altro riferimento al plugin JSPC in un file POM di sottodirectory (myproject-war/pom.xml). Risolvere il problema è stato risolto sia in /pom.xml che in myproject-war/pom.xml. Ecco il frammento di POM aggiornato ho usato:

 <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> 

Inoltre, ho dovuto aggiornare il mio gatto fornito dipendenze, dal momento che l'artifactId di ogni dipendenza Tomcat è cambiato nella nuova versione; es:

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

invece di:

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

(Nota: tomcat.version è proprietà definita nel mio POM principale):

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

Forse non capisco, ma qual è lo scopo di avere tomcat-jasper nel tuo percorso di classe e quel buch di esclusione nel plugin jspc? – Zarathustra

0

Sembra che non sia incluso un jar richiesto nel classpath.

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

sopra mostra legame che file jar ha la classe in esso e vedo che è a Catalina-6 * .jar Così sto indovinando questo viene rimosso/deprecato/aggiornata in Tomcat 7.

Si può provare a includere questo file jar nel classpath (che non è una buona idea allo stesso tempo) in quanto potrebbe creare altri conflitti o influenzare la portabilità delle app.

+0

Sono d'accordo, sembra inclusi i file di libreria da Tomcat 6 potrebbe risolvere il problema come un approccio stop-gap; ma, non voglio seguire quel corso a meno che non riesca a trovare altre soluzioni. Voglio capire il modo "corretto" per compilare JSP per Tomcat 7 ... supponendo che questa sia la fonte del problema. – RMorrisey

1

Ho avuto lo stesso problema, perché EvalTag.jar necessario org.apache.AnnotationProcessor per eseguire

La mia semplice soluzione era ricreare l'interfaccia direttamente nel mio applicat ionico. In questo modo non ho bisogno di tutto il jasper.jar di 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; 
} 
Problemi correlati