【问题标题】:JasperException: Unable to compile class for JSP - Tomcat 8 plus Spring MVCJasperException:无法为 JSP 编译类 - Tomcat 8 plus Spring MVC
【发布时间】:2016-06-23 10:01:17
【问题描述】:

我成功地遵循了 Oracle 的优秀教程,该教程展示了如何创建可以通过 java -jar \targeg\"myExecutableJar" 启动的嵌入式 tomcat 应用程序。在这样的教程中根本没有 Spring。 (Oracle Tutorial

然后我编辑了 index.jsp,如下所示。显然,我在 pom.xml 中添加了所有必需的 Spring lib。

在此之后,我从我的问题主题中得到了错误。我已经阅读了几个具有类似观点的问题,但没有一个能解决我的问题。例如,在某些问题中,有人告诉检查 ecj,所以我在 pom.xml 中添加了它。其他答案建议使用最新的 Tomcat。我做到了。

在我看来,某些嵌入式 tomcat 库和其他库之间可能存在一些冲突,但我无法想象是哪一个。

其他可能性可能与 spring 上下文的某些问题有关,特别是因为它是一个嵌入式 tomcat,但我猜不出还有什么可以尝试的。

我是否缺少任何额外的配置?请注意,在下图中,我将 META-INF 下的 context.xml 完全保留为自动生成的,并将所有 bean 定义放在 App-servlet.xml 中。

index.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<html>

<body>



<h2>Uploading a file.. </h2>

      <form:form method="POST" action="uploadFile" enctype="multipart/form-data">

              Upload your file please:

              <input type="file" name="file" />

              <input type="text" name="name">

              <input type="submit" value="Upload" />

              <form:errors path="file" cssStyle="color: #ff0000;" />

       </form:form>



</body>

</html>

App-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:context="http://www.springframework.org/schema/context"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="

   http://www.springframework.org/schema/beans    

   http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

   http://www.springframework.org/schema/context

   http://www.springframework.org/schema/context/spring-context-4.2.xsd">



       <context:component-scan base-package="com.example.employees" />



       <bean

              class="org.springframework.web.servlet.view.InternalResourceViewResolver">

              <property name="prefix" value="/WEB-INF/" />

              <property name="suffix" value=".jsp" />

       </bean>



       <bean id="multipartResolver"

              class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />



</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">



       <display-name>Spring MVC Application</display-name>









       <servlet>

              <servlet-name>App</servlet-name>

              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

              <init-param>

                     <param-name>contextConfigLocation</param-name>

                     <param-value>/WEB-INF/App-servlet.xml</param-value>

              </init-param>

              <load-on-startup>1</load-on-startup>

       </servlet>



       <servlet-mapping>

              <servlet-name>App</servlet-name>

              <url-pattern>/</url-pattern>

       </servlet-mapping>

       <welcome-file-list>

              <welcome-file>index.jsp</welcome-file>

       </welcome-file-list>

</web-app>

pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

       <modelVersion>4.0.0</modelVersion>

       <groupId>com.example.employees</groupId>

       <artifactId>employees-app</artifactId>

       <packaging>war</packaging>

       <version>1.0-SNAPSHOT</version>

       <name>employees-app Maven Webapp</name>

       <url>http://maven.apache.org</url>

       <properties>

              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

              <tomcat.version>8.0.32</tomcat.version>

              <spring.version>4.2.5.RELEASE</spring.version>

       </properties>

       <dependencies>



              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-web</artifactId>

                     <version>${spring.version}</version>

              </dependency>



              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-webmvc</artifactId>

                     <version>${spring.version}</version>

              </dependency>



              <dependency>

                     <groupId>commons-fileupload</groupId>

                     <artifactId>commons-fileupload</artifactId>

                     <version>1.3.1</version>

              </dependency>



              <dependency>

                     <groupId>org.apache.tomcat.embed</groupId>

                     <artifactId>tomcat-embed-core</artifactId>

                     <version>${tomcat.version}</version>

              </dependency>

              <dependency>

                     <groupId>org.apache.tomcat.embed</groupId>

                     <artifactId>tomcat-embed-logging-juli</artifactId>

                     <version>${tomcat.version}</version>

              </dependency>

              <dependency>

                     <groupId>org.apache.tomcat.embed</groupId>

                     <artifactId>tomcat-embed-jasper</artifactId>

                     <version>${tomcat.version}</version>

              </dependency>

              <dependency>

                     <groupId>org.apache.tomcat</groupId>

                     <artifactId>tomcat-jasper</artifactId>

                     <version>${tomcat.version}</version>

              </dependency>

              <dependency>

                     <groupId>org.apache.tomcat</groupId>

                     <artifactId>tomcat-jasper-el</artifactId>

                     <version>${tomcat.version}</version>

              </dependency>

              <dependency>

                     <groupId>org.apache.tomcat</groupId>

                     <artifactId>tomcat-jsp-api</artifactId>

                     <version>${tomcat.version}</version>

              </dependency>

              <dependency>

                     <groupId>jstl</groupId>

                     <artifactId>jstl</artifactId>

                     <version>1.2</version>

              </dependency>

              <dependency>

                     <groupId>javax.servlet</groupId>

                     <artifactId>javax.servlet-api</artifactId>

                     <version>3.0.1</version>

              </dependency>

              <dependency>

                     <groupId>org.eclipse.jdt.core.compiler</groupId>

                     <artifactId>ecj</artifactId>

                     <version>4.5.1</version>

              </dependency>



       </dependencies>

       <build>

              <finalName>employees-app</finalName>

              <resources>

                     <resource>

                           <directory>src/main/webapp</directory>

                           <targetPath>META-INF/resources</targetPath>

                     </resource>

              </resources>

              <plugins>

                     <plugin>

                           <groupId>org.apache.maven.plugins</groupId>

                           <artifactId>maven-compiler-plugin</artifactId>

                           <version>3.5.1</version>

                           <inherited>true</inherited>

                           <configuration>

                                  <source>1.8</source>

                                  <target>1.8</target>

                           </configuration>



                     </plugin>

                     <plugin>

                           <groupId>org.apache.maven.plugins</groupId>

                           <artifactId>maven-assembly-plugin</artifactId>

                           <configuration>

                                  <descriptorRefs>

                                         <descriptorRef>jar-with-dependencies</descriptorRef>

                                  </descriptorRefs>

                                  <finalName>employees-app-${project.version}</finalName>

                                  <archive>

                                         <manifest>

                                                <mainClass>com.example.employees.Main</mainClass>

                                         </manifest>

                                  </archive>

                           </configuration>

                           <executions>

                                  <execution>

                                         <phase>package</phase>

                                         <goals>

                                                <goal>single</goal>

                                         </goals>

                                  </execution>

                           </executions>

                     </plugin>

              </plugins>

       </build>

</project>

日志:

type Exception report

message Unable to compile class for JSP

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

        org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:600)

        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)

        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

java.lang.NullPointerException

        org.apache.jasper.JspCompilationContext.getTldResourcePath(JspCompilationContext.java:551)

        org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:420)

        org.apache.jasper.compiler.Parser.parseDirective(Parser.java:479)

        org.apache.jasper.compiler.Parser.parseElements(Parser.java:1435)

        org.apache.jasper.compiler.Parser.parse(Parser.java:139)

        org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)

        org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)

        org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)

        org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)

        org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)

        org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)

        org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:585)

        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)

        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)

        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)

        javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

************已添加

【问题讨论】:

    标签: java spring maven jsp tomcat


    【解决方案1】:

    这可能是由于servlet.jar jar 冲突。 Tomcat 已经附带了 servlet api 库。尝试在 pom.xml 中为 servlet 依赖项添加 &lt;scope&gt;provided&lt;/provide&gt;

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

    此依赖项已由您的容器(即 Tomcat)提供,因此您不必再次将其包含在已部署的应用程序中。

    您可以尝试的其他方法:

    • 尝试项目 -> 清理并重新运行项目
    • 您应该至少需要 JSP 2.1 并将其标记为在您的 POM 中提供

      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.1</version>
          <scope>provided</scope>
      </dependency>
      
    • 一个可能的原因是临时文件无法写入当前目录。

    • this article 专用于 1.8 版本的 JDK。
    • 在 Tomcat 8 中,Jasper 初始化作为标准实现 ServletContainerInitializer(检查 Servlet 规范)。 所以你应该确保 org.apache.jasper.servlet.JasperInitializer.onStartup 被调用 在网络应用程序启动期间。 Source

    • 使用context.addServletContainerInitializer(new JasperInitializer(), null); 设置上下文
    • 相关其他人https://github.com/spring-projects/spring-boot/issues/962 & https://github.com/bmuschko/gradle-tomcat-plugin/issues/132

    【讨论】:

    • 幸运,我在您的建议后添加了一张显示结果的图片。请问有没有其他冲突?
    • @JimC 你也可以为jstl-1.2.jar depedency 做同样的事情吗?
    • @JimC 用其他可能的解决方案更新了我的答案。祝你好运
    • 幸运的是,我仔细阅读了您的所有建议。就我而言,它是一个嵌入式 tomcat。您认为我应该将 tomcat-jsp-api 更改为其他 jsp-api 吗?其他疑问,请看我启动应用程序的方式(main方法)。如何添加您的建议“context.addServletContainerInitializer(new JasperInitializer(), null);”那里? PS。在 Eclipse 内部运行或将其作为 war 文件部署到 Tomcat 时,我完全没有问题。问题确实与嵌入式Tomcat有关(可能是main方法,文件夹结构,一些lib)
    • @JimC 您能否在您提供的示例中使用 pom.xml 中提到的所有依赖项的相同版本? oracle.com/webfolder/technetwork/tutorials/obe/java/…您使用的是tomcat 8,而您遵循的教程链接使用的是tomcat 7。您真的要包含Spring jar吗?这是您可以从教程链接资源选项卡oracle.com/webfolder/technetwork/tutorials/obe/java/… 下载并运行的 maven 项目 zip 文件
    【解决方案2】:

    从 pom.xml 中删除以下依赖项。手动添加项目运行时间。

              <dependency>
    
                     <groupId>org.apache.tomcat.embed</groupId>
    
                     <artifactId>tomcat-embed-core</artifactId>
    
                     <version>${tomcat.version}</version>
    
              </dependency>
    
              <dependency>
    
                     <groupId>org.apache.tomcat.embed</groupId>
    
                     <artifactId>tomcat-embed-logging-juli</artifactId>
    
                     <version>${tomcat.version}</version>
    
              </dependency>
    
              <dependency>
    
                     <groupId>org.apache.tomcat.embed</groupId>
    
                     <artifactId>tomcat-embed-jasper</artifactId>
    
                     <version>${tomcat.version}</version>
    
              </dependency>
    
              <dependency>
    
                     <groupId>org.apache.tomcat</groupId>
    
                     <artifactId>tomcat-jasper</artifactId>
    
                     <version>${tomcat.version}</version>
    
              </dependency>
    
              <dependency>
    
                     <groupId>org.apache.tomcat</groupId>
    
                     <artifactId>tomcat-jasper-el</artifactId>
    
                     <version>${tomcat.version}</version>
    
              </dependency>
    
              <dependency>
    
                     <groupId>org.apache.tomcat</groupId>
    
                     <artifactId>tomcat-jsp-api</artifactId>
    
                     <version>${tomcat.version}</version>
    
              </dependency>
    

    【讨论】:

    • 如果我正确理解了您所说的建议:从 pom.xml 中删除所有 tomcat 依赖项并手动添加它们。如果是这样,由于我使用的是 (1) mvn clean compile、(2) mvn package 和 (3) java -jar \target\myExecutable.jar,如何手动添加它们?据我所知,由于这些 pom.xml 行,依赖库被放置在 myExecutable.jar/WEB-INF/libs 中。您将如何手动完成?你会避免使用 maven 并遵循其他程序吗?
    • org.apache.tomcat.maventomcat-maven-plugin2.2localhost:8080/proName/</url> 8080
    • 我知道您提出了两个新建议,我的意思是,您没有向我展示如何“手动添加库”,对吧?好吧,我知道如何下载它们并将它们包含在 lib 文件夹中,但我真的在问自己,当你说“手动”时,你是不是这个意思。在 apache.googlesource 中,有一种比我更“聪明”的方法,但 maven 设置依赖项与我的基本相同。你是从那里建议我一些具体的观点吗?例如:managerWebAppPath 或 **/**IT* 或 java.io.tmpdir 或 unzip src="src/test/manager.war"。这就是您所说的“手动”吗?
    • 关于我之前使用过的tomcat-maven-plugin,在我的情况下没有效果。
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多