JasperException:无法为JSP编译类 - Tomcat 8加Spring MVC

时间:2016-03-09 06:37:13

标签: java spring maven jsp tomcat

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

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

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

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

其他可能性可能与spring上下文的某些问题有关,特别是因为它是一个嵌入式tomcat但我无法猜测其他任何事情要尝试。

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

Project Structure and the main method

的index.jsp

HttpOnly

应用-servlet.xml中

SELECT a.*, dups.Flag
FROM app a INNER JOIN (
    SELECT ApplicationID, CASE
          WHEN MIN(TeamMember) = MAX(TeamMember) THEN 'Alike'
          ELSE 'Dup'
        END Flag
    FROM app t
    GROUP BY ApplicationID) dups
  ON a.ApplicationID = dups.ApplicationID

的web.xml

<%@ 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>

POM

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

日志:

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

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

enter image description here

2 个答案:

答案 0 :(得分:4)

这可能是由于servlet.jar jar冲突造成的。 Tomcat已经加入了servlet api库。尝试在pom.xml中为servlet依赖项添加<scope>provided</provide>

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

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

您可以尝试的其他事项:

  • 试用项目 - &gt;清理并重新运行项目
  • 您至少应该要求使用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初始化是作为标准实现的   ServletContainderInitializer(检查Servlet规范)。   所以你应该确保   调用org.apache.jasper.servlet.JasperInitializer.onStartup   在网络应用启动期间。 Source

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

答案 1 :(得分:1)

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