解決 Unable to compile class for JSP 問題

在使用jsp頁面時,出現這個問題:

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

An error occurred at line: [29] in the generated java file: [/webapps/apache-tomcat8-dev/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java]
Type mismatch: cannot convert from HashSet<?> to Set<String>

An error occurred at line: [29] in the generated java file: [/webapps/apache-tomcat8-dev/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java]
Cannot instantiate the type HashSet<?>

An error occurred at line: [29] in the generated java file: [/webapps/apache-tomcat8-dev/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java]
Syntax error on token "<", ? expected after this token

    Stacktrace:
        org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
        org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:198)
        org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:450)
        org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)
        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)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

解決方法:

       首先,查看Tomcat路徑下的\lib文件夾,檢查名爲ecj-4.6.3的jar(可能會版本不同,但是我這個版本號沒有問題),查看是否有其他版本的jar,如果有請刪除低版本的jar,這會引起衝突而導致這個異常發生。如果還不可以請將你自己引入的jsp-api,以及servlet-api的pom依賴加上<scope>provided</scope>。

 

 

 

報錯異常信息解釋:

       異常中報出的HashSet   是jsp被編譯成.java文件後所產生的Java文件,而錯誤就是在將.Java文件生成.class文件時出現的。因爲jar衝突 所以.class文件無法被生成。  這個HashSet是用來放置jsp頁面所引入的包,以及jsp依賴的jar信息。如下圖所示,所以報出的錯誤與自己的代碼並沒有關係。

Maven 中 scope的解釋:

對於scope=compile的情況(默認scope),也就是說這個項目在編譯,測試,運行階段都需要這個artifact(模塊)對應的jar包在classpath中。 
而對於scope=provided的情況,則可以認爲這個provided是目標容器已經provide這個artifact。換句話說,它隻影響到編譯,測試階段。在編譯測試階段,我們需要這個artifact對應的jar包在classpath中,而在運行階段,假定目標的容器(比如我們這裏的liferay容器)已經提供了這個jar包,所以無需我們這個artifact對應的jar包了。       

          因爲Tomcat自帶有jsp-api,以及servlet-api依賴,爲了防止自己引入的pom與Tomcat自帶依賴衝突,可以使用<scope>provided</scope>使自己的pom依賴不參與運行。其實項目在啓動時,會先加載用戶自己的jar,然後再加載Tom的依賴。

 

希望這篇文章可以幫到你解決問題....