記:SpringBoot項目莫名出現ClassNotFoundException


最近某個開發環境的某個應用,隔三差五出現了某某頁面找不到,網上百度找了些同類的問題都是說jstl包與默認tomcat里的包沖突,但都感覺和我的問題不是很搭配(因為相同框架的其他項目都可以正常允許)
  1. 報錯信息如下:
    17:40:18.890 [http-nio-8088-exec-18] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.view.jsp.poi.detail_jsp] with root cause
    java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.view.jsp.xxx_jsp
            at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
            at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:129)
            at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:60)
            at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:128)
            at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:171)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:380)
            at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
            at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:112)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
            at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:467)
            at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:392)
            at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
            at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
            at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
            at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286)
            at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041)
            at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
            at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
            at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
            at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
            at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
            at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    
  2. 原因
    說真的,起初一看到這樣的問題,腦海里直接就閃出一個答案,服務器打的包有問題,但是隔三差五出現這樣的問題,就開始懷疑真的是包問題?
    經驗證並不是!!!!!!!!!!
    
    每當出現這樣的問題,我都會重新打個包到線上,嗯,報錯找不到的頁面可以訪問了,但是隔了和多天發現另外一個頁面同樣的問題;這個時候開始認真起來了,開始了百度尋找難兄難弟,一百度發現全是說的是包沖突;
    
    我檢查了一遍包發現並沒有那樣的沖突,我猜是不是服務器的問題,我就重啟了一下項目,這個時候之前報錯的頁面可以訪問了。。。基本確定是和服務器有關!
    

    真正的原因

    有多少小伙伴知道springboot項目運行的項目解壓文件在哪? 如果未自定義默認在/tmp文件夾下生成tomcat.xxxx文件,而linux有刪除策略會刪除臨時文件
    
    項目編譯文件地址

    avatar

    為了保證tmp目錄不爆滿,linux服務器會自動刪除一些長時間不訪問的一些編譯文件(具體怎么刪不是很清楚),如果長達10天未訪問的臨時文件會被linux刪除掉!!
    
    現在想想開發環境的這個項目經常很長時間沒人訪問,也沒有自定義過編譯文件目錄,已經可以肯定就是這個問題導致的
    
  3. 解決方法

    在springboot的配置文件中增加配置,增加配置tomcat.basedir的路徑
    
    server:
      port: 8088
      tomcat:
        basedir: /usr/local/tmp
    

    總結

    感謝道友!!!
    原文:https://www.liangzl.com/get-article-detail-133406.html
    
    切換了臨時目錄的小伙伴也需要時常去檢查下新的目錄下的編譯文件的大小哦,及時刪除!別過了很長時間導致撐爆了內存
    
    經常在項目中遇到各種各樣的千奇百怪的問題, 怎么解決的、為什么還是要記錄下來,因為你不知道啥時候又遇到了!!!
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM