IntelliJ IDEA + tomcat 9,無法部署時報錯(servlet的urlpattern錯誤和jar包重複)

今天發現在部署一個簡單的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包衝突了。完美解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章