Java.lang.ClassNotFoundException: org.apache.jsp.index_jsp

У меня есть старое приложение struts 1, которое всегда было построено с помощью Ant, которое я конвертирую для использования Maven. Структура моего приложения является модульной, с управлением зависимостями в содержащем модуле. Секция содержащего модуля dep mgmt содержит:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        ...
    </dependencies>
</dependencyManagement>

Когда я создаю войну (я запускаю задание Maven из t21) из содержащего модуля) и запускаю конфигурацию Tomcat с этой войной из intelliJ, я вижу в браузере следующее:

org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:161)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause
org.apache.jasper.JasperException: Unable to load class for JSP
org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:630)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:149)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause
java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
java.net.URLClassLoader$1.run(URLClassLoader.java:202)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:190)
org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:134)
org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:66)
org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:628)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:149)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Все, что я могу найти при поиске по этому вопросу, говорит о том, что причиной является конфликт версий в javax.servlet jars, но в моем каталоге WEB-INF/lib ничего нет. Я попытался использовать область provided, compile и даже install/pom, но они ничего не помогают.

В журналах tomcat нет ничего дополнительного.

Я подтвердил, что jsps компилируются. Я использую jspc-maven-plugin.

В моем подмодуле (не содержащем его) pom.xml у меня есть:

<build>
    <!-- default goal to run if somebody doesn't pick one (rarely matters) -->
    <defaultGoal>install</defaultGoal>

    <!-- resources and filtering - also see configuration under maven-war-plugin below -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <filters>
        <filter>src/main/resources/${env}.properties</filter>
        <filter>src/main/resources/${env}.tokens</filter>
    </filters>

    <plugins>
        <!-- begin - precompiling jsps -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jspc-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>jspc</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <warSourceDirectory>${basedir}/src/main/webroot</warSourceDirectory>
                        <inputWebXml>${basedir}/src/main/webroot/WEB-INF/web.xml</inputWebXml>
                        <!--<workingDirectory>${basedir}/src/main/webroot</workingDirectory>-->
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- end - precompiling jsps -->

        <!-- used to build warfiles -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <webResources>
                    <resource>
                        <directory>${pom.basedir}/src/main/webroot</directory>
                        <filtering>true</filtering>
                        <!--<targetPath>WEB-INF</targetPath>-->
                    </resource>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
</build>

Я могу видеть в выходе сборки maven, который компилируется jsps. Но я все еще получаю исключение JasperException.

Ответ 1

Прошло некоторое время с тех пор, как я опубликовал это, но я подумал, что покажу, как я это понял (насколько я помню сейчас).

Я создал дерево зависимостей Maven для поиска конфликтов зависимостей, и я удалил все конфликты с исключениями в зависимостях, например:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging-api</artifactId>
    <version>1.1</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Кроме того, я использовал область provided для зависимостей javax.servlet, чтобы не вводить дополнительный конфликт с тем, что предоставлено Tomcat при запуске приложения.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

НТН.

Ответ 2

В дополнение к другим ответам, которые не работали для меня: В моем случае ошибка произошла из-за ошибок разрешений. Проект был развернут во время работы tomcat с правами root, позже, когда он был запущен как пользователь tomcat, я получил ошибку из названия вопроса.

Решение в моем случае состояло в том, чтобы установить правильные разрешения, e.x. в системе unix:

cd <tomcat-dir>
chown -R <tomcat-user> *

Ответ 3

У меня была такая же проблема в моем проекте. Я использовал IntelliJ Idea 14 и Maven 8. И то, что я заметил, это то, что когда я добавил адресату tomcat в IDE, он автоматически связал две банки из каталога tomcat lib, они были servlet-api и jsp-api. Также у меня были они в моем pom.xml. Я убил целый день, пытаясь понять, почему я получаю java.lang.ClassNotFoundException: org.apache.jsp.index_jsp. И kewpiedoll99 является правильным. Это потому, что есть конфликты зависимости. Когда я добавил, чтобы предоставить эти два баночки в моем pom.xml, я нашел счастье:)

Ответ 4

Какую версию tomcat вы используете? Что мне кажется, так это то, что версия tomcat не поддерживает версии сервлета и jsp, которые вы используете. Вы можете изменить что-то вроде ниже или заглянуть в свою версию tomcat на то, что она поддерживает, и соответственно изменить версии.

 <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

Ответ 5

Я также потерял половину дня, пытаясь исправить это.

Похоже, что root был моим файлом проекта pom.xml с зависимостью:

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>

Другие члены команды не испытывали никаких проблем. В конце появилось, что я получил более новый tomcat, который предоставил другую версию jsp-api (в tomcat 7.0.60 и выше это будет jsp-api 2.2).

Итак, в этом случае параметры будут:

a) installing different (older/newer) tomcat like (Exactly what I did, because team is on older version)
b) changing dependency scope to 'compile'
c) update whole project dependencies to the actual version of Tomcat/lib provided APIs
d) put matching version of the jsp-api.jar in {tomcat folder}/lib

Ответ 6

Это было вызвано из-за чего-то подобного в моем случае:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <include-prelude>/headerfooter/header.jsp</include-prelude>
        <include-coda>/headerfooter/footer.jsp</include-coda>
    </jsp-property-group>
</jsp-config>

Проблема в том, что у меня не было header.jsp в моем проекте. Однако сообщение об ошибке все еще указывало, что index_jsp не найден.