Tomcat 7上的JSP因NoClassDefFoundError而失败:Lorg/apache/AnnotationProcessor

RMo*_*sey 5 jsp maven-2 tomcat7

我正在从Tomcat 6.0.24升级到7.0.23.我有一个maven 2.2.1项目,它使用jspc maven插件预编译JSP.

当我为我的应用程序部署WAR文件并尝试访问JSP时,我收到以下错误:

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)
...
Run Code Online (Sandbox Code Playgroud)

我曾尝试从这篇博文中借用一段POM 来使jspc与Tomcat 7一起工作,但这并没有解决问题.我该如何解决这个问题?任何指向正确的方向将不胜感激.

RMo*_*sey 5

事实证明,我在子目录POM文件(myproject-war/pom.xml)中有另一个对JSPC插件的引用.在/pom.xml和myproject-war/pom.xml中修复它足以解决问题.这是我使用的更新的POM代码段:

        <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>
Run Code Online (Sandbox Code Playgroud)

另外,我不得不更新我的tomcat提供的依赖项,因为每个Tomcat依赖项的artifactId在新版本中已经改变; 例如:

                <dependency>
                     <groupId>org.apache.tomcat</groupId>
                     <artifactId>tomcat-jasper</artifactId>
                     <version>${tomcat.version}</version>
                     <scope>provided</scope>
                </dependency>
Run Code Online (Sandbox Code Playgroud)

代替:

                <dependency>
                     <groupId>org.apache.tomcat</groupId>
                     <artifactId>jasper</artifactId>
                     <version>${tomcat.version}</version>
                     <scope>provided</scope>
                </dependency>
Run Code Online (Sandbox Code Playgroud)

(注意:tomcat.version是我的主POM中定义的属性):

<properties>
    ...
    <tomcat.version>7.0.23</tomcat.version>
    ...
</properties>
Run Code Online (Sandbox Code Playgroud)