【问题标题】:java.lang.ClassNotFoundException: org.apache.jsp.index_jspjava.lang.ClassNotFoundException: org.apache.jsp.index_jsp
【发布时间】:2013-11-13 19:52:20
【问题描述】:

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

【问题讨论】:

    标签: jsp maven


    【解决方案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>
    

    HTH。

    【讨论】:

      【解决方案2】:

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

      在我的情况下,解决方案是设置正确的权限,例如在 Unix 系统上:

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

      【讨论】:

        【解决方案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 中向这两个 jar 中添加提供时,我发现了一种幸福 :)

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            你用的是什么版本的tomcat?在我看来,tomcat 版本不支持您正在使用的 servlet 和 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>
            

            【讨论】:

            • 我使用的是 6.0.35,它似乎支持 Servlet 2.5 和 JSP 2.1。我意识到这是一个比我包含的更新版本的 jsp-api,所以我将我的升级到了最新的 2.2。我还做了一个 mvn 依赖树,并确保依赖项不包含冲突的版本。还是没有骰子。即使按照您的建议使用provided 也无法解决问题。
            • 您是否正在执行干净的构建/运行?你用的是什么版本的maven?此外,您正在使用的那个 jsp-maven 插件根本不需要。我相信你使用的是 maven 2.x
            • 我正在做干净的构建;我定期清除 IntelliJ 的缓存。我正在使用 Apache Maven 3.1.1 - 是的,我将那个 jsp 预编译移到了 prod 配置文件中,后来才意识到我不需要(或不想要)开发人员。坦率地说,在我意识到我知道得更好之前,这是抓住了一根稻草(“也许我需要预编译?”)。我仍然被困住了,所以如果您想到其他任何事情,我很想听听。谢谢。
            【解决方案6】:

            我也浪费了半天的时间来解决这个问题。

            看来 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
            

            【讨论】:

              【解决方案7】:

              在我的情况下,这是由于类似的原因造成的:

              <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 没有找到。

              【讨论】:

                【解决方案8】:

                在我的情况下,通过为 tomcat 主路径设置正确的权限来解决问题:

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

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-05-08
                    • 2012-12-03
                    • 1970-01-01
                    • 2015-02-22
                    • 2018-01-13
                    • 2021-08-15
                    相关资源
                    最近更新 更多