問題場景
有一個老項目,其中的tomcat有引入聽雲的插件。之後,因爲項目不需要了,所以需要移除相關的插件。之前是直接在啓動命令裏面加上javaagent
參數。現在移除了這個參數,但是啓動了,提示報錯,報錯提示如下:
java.lang.ClassNotFoundException: com.tingyun.api.agent.TingYunApiImpl
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:126)
at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.apache.jsp.admin.commonModule.fastdfs.index_jsp._jspService(index_jsp.java:180)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
問題環境
軟件 | 版本 |
---|---|
tomcat | 7.0 |
JDK | 1.6 |
問題原因
如果瞭解tomcat
的目錄結構的話,遇到這個問題的時候,應該知道是爲什麼。這是tomcat
的內部機制導致的。對於JSP
文件,tomcat在調用JSP
頁面的時候,在第一次調用的時候,會在本地的工作目錄的work/Catalina/
生成對應的域名的文件夾,裏面會存放對應的JSP
生成的java
文件,並進行編譯,形成對應的class
文件。如下圖:
所以,如果是新頁面,第一次調用的時候,會比較慢。等編譯成功之後,調用起來就比較快了。之後,如果JSP
頁面有變動的時候,tomcat
檢測到就會進行更新。
所以,有經驗的運維及開發,就會在更新代碼的時候,順便刪除掉 work
目錄,避免出現問題。
那麼,聽雲這個插件啓動的時候,會在對應的頁面加入對應的代碼。而這部分代碼已經被生成在work
目錄下面了。如果我們只是移除插件,而沒有變動代碼,那麼原來已經包含插件的代碼就會出現問題。
解決方案
既然知道了原因了,那我們在腳本移除聽雲的配置的時候,也得將tomcat
的work
目錄給刪除掉。
結果
將tomcat
的work
目錄給刪除掉,重新啓動無報錯。
總結
瞭解tomcat
的目錄結構,遇到一些問題,就可以很輕易的解決掉。
隨緣求贊
如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以點擊關注
可以掃描以下二維碼,關注我的公衆號:楓夜之求索閣,查看我最新的分享!