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 не найден.