1. 程式人生 > >JSP-匯入taglib 出現classNotFound異常:java.lang.ClassNotFoundException: org.apache.taglibs.standard.tlv.Jst

JSP-匯入taglib 出現classNotFound異常:java.lang.ClassNotFoundException: org.apache.taglibs.standard.tlv.Jst

案例


前端登入跳轉到指定jsp,報classNoFoundException,原因是頁面匯入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 導致的

Caused by: java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.jsp.common.index_005fmenu_jsp
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:132)
    at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:121)
    at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
    ... 52 more


在pom.xml新增如下配置發現也沒效果


 <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
 </dependency>


解決方案


經網上搜索,是缺少jstl相關包的問題,剛才我們只是匯入了jstl-api,而沒有匯入jstl的實現,所以再匯入jstl 的實現。去mvnrepository上找jstl 的實現,基本上有兩個版本,一個是glassfish 的jstl-impl, 另一個是apache的taglibs-standard-impl,一直猶豫不決該用誰,最後在stackoverflow.com/a/25374024/1443527上發現網友分享了他實現的經驗,他用的是glassfish版本,所以我們也引人這個。由於tomcat7是相容j2ee 3.0規範的,所以我們將jstl 依賴的東西給去除掉,防止和tomcat自身的servlet jar包衝突,改正後的依賴為

 <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
 
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jstl-impl</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet.jsp.jstl</groupId>
                    <artifactId>jstl-api</artifactId>
                </exclusion>
            </exclusions>
 </dependency>


順便說一下jstl-impl-1.2.jar 和taglibs-standard-impl-1.2.1.jar 的區別,這兩個包的內容很相似,後者應該是前者的一個再打包,因為Apache的taglibs工程從2009年以後一直處於停止狀態。


如果你要引人後者,那麼依賴應該為:

 

    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-spec</artifactId>
      <version>1.2.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-impl</artifactId>
      <version>1.2.1</version>
    </dependency>


參考文章:http://www.javacoder.cn/?p=195


--------------------- 
作者:Evan_Leung 
來源:CSDN 
原文:https://blog.csdn.net/evan_leung/article/details/51813842