今天發現在部署一個簡單的Servlet的時候發生了問題,顯示部署失敗。那時我能確信tomcat啓動成功並且開啓連接,其次我的項目也成功的編譯,並且被做成了idea的一個正確的arifact,tomcat也設置了正確的部署設置。
這個問題出現在我寫了一個servlet之後,@WebServlet的urlpattern參數寫錯了,把"/hello"寫成"hello"。那之前沒有出現部署問題。
但我一時沒有想到是servlet的問題,而是在idea的project structure和tomcat的configuration裏調整。除此之外,我還以爲是我把電腦上所有jar包全部放在一個javaexlib文件夾裏然後引用的問題,因爲另一個成功部署的項目,在部署javaexlib之後就失敗了。
首先解決第一個問題的經過。
項目結構的arifact目錄結構的設置
甚至這個項目在編譯之後已經被做成了一個arifact,只需要讓tomcat把這裏作爲CATALINA_BASE執行即可。
tomcat已部署,設置了虛擬的localhost的根目錄爲/。
結果產生了一大串報錯,如下圖:
查找了網絡上所有教程,很少出現這種情況,且所有查找出的原因(jar包重複,servlet類前面的@WebServlet標註和web.xml文件裏的<servlet>標籤重複)都無效,而且依據對tomcat和idea工作流程(編譯文件到一個指定目錄,如默認的項目根目錄的out/product文件夾下,然後將需要部署的內容做成一個arifact,如out/arifact文件夾下,最後部署到本項目根目錄的web文件夾下,讓tomcat從這裏啓動)的理解,不應該出現錯誤!!!
於是我硬着頭皮仔細查找每一句,看看究竟是什麼問題。
直到我看到一串紅色報錯裏有一句白字:
白字後面的第二個Cased by紅字裏有一個Invalid <url-patter>,於是我找到唯一的servlet
的
然後改成
就通過了。
然後是第二個問題,部署lib時出錯,我把電腦上所有比如mysql jdbc之類的jar的包和庫全部放在了javaexlib文件夾下。
部署時候,不部署這個多餘的包文件夾即可完好運行。
但是一旦部署時將這個文件夾部署——
部署之後:
之後報錯:
有了第一個問題的解決經驗,我明白要先看看報錯,但這回白字在底部
然後往回找
找到第一句
猜測之前看到的jar重複問題,顯然我們不部署javaexlib即可,但我決定嘗試驗證問題。
於是我查看項目目錄的arifact文件夾,跟idea顯示的不一樣,亂的很,我認爲是之前亂設置路徑弄亂了文件,就刪除arifact下的所有東西,重新部署,發現可以運行,但servlet(HelloServlet,url爲"/hello")的doGet無法工作。此時打開,發現根目錄下的out/arifact/我的項目/web-info文件夾和web裏的web-info全空的,就重啓idea重新部署,訪問/hello顯示404 not found,然後修改了HelloServlet文件,重新編譯,之後/hello頁面正常工作。但是web文件夾下仍然空着(/out/arifact內容符合正常人理解),也就是說,tomcat運行根目錄是/out/arifact/your_project,而web文件夾只是前端頁面等resources。
進入正題,爲什麼部署出錯。
我直接刪掉了classpath下的javaexlib裏的所有內容,也沒有在部署時添加javaexlib內的包,也就是說,我只有在項目編譯時才必須使用javaexlib的(爲了import servlet而使用的)包。我仔細一想,我的javaexlib裏的內容大多是複製自tomcat的lib,也就是說,這兩個lib文件夾纔是重複的根源,就類似於jdk和jre,一個需要開發時包,一個需要運行時包。
所以根源就是,tomcat的lib和部署的javaexlib裏的jar包衝突了。完美解決。