JSP на Tomcat 7 завершается с ошибкой NoClassDefFoundError: Lorg / apache / AnnotationProcessor - PullRequest
5 голосов
/ 19 января 2012

Я нахожусь в процессе обновления с Tomcat 6.0.24 до 7.0.23.У меня есть проект maven 2.2.1, который предварительно компилирует JSP с помощью плагина jspc maven.

Когда я развертываю файл 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)
...

Я попытался позаимствовать фрагмент POM из этого сообщения в блоге , чтобы заставить jspc работать с Tomcat 7, но это не устранило проблему.Как я могу решить эту проблему?Любые указатели в правильном направлении будут оценены.

Ответы [ 3 ]

5 голосов
/ 20 января 2012

Оказывается, у меня была другая ссылка на плагин JSPC в POM-файле подкаталога (myproject-war / pom.xml).Чтобы решить проблему, достаточно было исправить это как в /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>

Кроме того, мне пришлось обновить предоставляемые Tomcat зависимости, так как artifactId каждой зависимости Tomcat изменился в новой версии;Например:

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

вместо:

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

(Примечание: tomcat.version - это свойство, определенное в моем главном POM):

<properties>
    ...
    <tomcat.version>7.0.23</tomcat.version>
    ...
</properties>
1 голос
/ 16 мая 2013

У меня была та же проблема, потому что EvalTag.jar требовался org.apache.AnnotationProcessor для запуска

Моим простым исправлением было воссоздание интерфейса непосредственно в моем приложении.Таким образом, мне не нужны все файлы jasper.jar 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;
}
0 голосов
/ 19 января 2012

Похоже, вы не включили требуемый jar в ваш classpath.

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

Приведенная выше ссылка показывает, в каком файле jar содержится класс, и я вижу, что он находится в catalina-6 * .jar Так что я предполагаю, что это удалено / устарело / обновлено в tomcat 7.

Вы можете попытаться включить этот файл jar в ваш classpath (что не является хорошей идеей одновременно), так как онможет создать другие конфликты или повлиять на переносимость ваших приложений.

...