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

时间:2013-11-13 19:52:20

标签: jsp maven

我有一个旧的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>

当我构建战争(我从包含模块运行package Maven作业)并使用来自intelliJ的战争运行Tomcat配置时,我在浏览器中看到以下内容:

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 jar中存在版本冲突,但我的WEB-INF / lib目录中根本没有任何内容。我尝试使用providedcompile甚至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。

9 个答案:

答案 0 :(得分:17)

我发布这篇文章已经有一段时间了,但我想我会说明我是怎么想出来的(我记得最好)。

我做了一个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>

HTH。

答案 1 :(得分:6)

对我不起作用的其他答案的补充:在我的情况下,由于权限错误而导致错误。当tomcat以root身份运行时,项目已部署,之后作为tomcat用户启动时,我从问题标题中得到了错误。

我的解决方案是设置正确的权限,e.x。在unix系统上:

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

答案 2 :(得分:3)

我的项目遇到了同样的问题。我使用了IntelliJ Idea 14和Maven 8。 我注意到的是,当我将一个tomcat目标添加到IDE时,它自动链接来自tomcat lib目录的两个jar,它们是servlet-api和jsp-api。我也在我的pom.xml中有它们。我杀了一整天试图找出为什么我得到java.lang.ClassNotFoundException:org.apache.jsp.index_jsp。而kewpiedoll99是正确的。那是因为存在依赖冲突。当我在我的pom.xml中添加提供给这两个罐子时,我发现了一个幸福:)

答案 3 :(得分:2)

我不得不删除 Tomcat 的工作目录,因为它缓存了以前生成的文件。为此:

  1. 停止Tomcat
  2. 删除“工作”目录
  3. 启动Tomcat

这将导致新生成工作目录。

答案 4 :(得分:1)

您使用的是什么版本的tomcat?在我看来,tomcat版本不支持servlet&amp;你正在使用的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 :(得分:1)

我也失去了半天试图解决这个问题。

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 :(得分:0)

这是因为我的情况是这样的:

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

答案 7 :(得分:0)

对于我来说,该问题是通过为tomcat主页路径设置正确的权限来解决的:

cd /opt/apache-tomee-webprofile-7.1.0/
chown -R tomcat:tomcat *

答案 8 :(得分:0)

我的情况是将.war文件手动移至/ var / lib / tomcat9 / webapps 并解压缩,然后在该目录中执行“ chown -R tomcat:tomcat *”,即可解决。