轉自https://blog.csdn.net/leo3070/article/details/88062663web
初次用idea的小白可能會很感到很神奇,intellij idea部署web項目在瀏覽器不須要輸入項目名就能夠直接訪問,非常方便啊。那麼 intellij 是如何實現這一功能的呢?在瞭解其原理以前須要掌握必定的知識哦。spring
咱們須要關注的是CATALINA_BASE與CATALINA_HOME的區別,這裏雖然表示的路徑是同樣的,配置tomcat多實例的時候就會不同了(後面會說).apache
意思爲 : CATALINA_HOME是Tomcat的安裝目錄,CATALINA_BASE是Tomcat的工做目錄
目的在於 : 當你須要在一臺機器上面部署多個Tomcat實例,可是你又不想建立多個Tomcat的副本,換句話說就是讓這些Tomcat副本擁有本身的工做目錄可是共享Tomcat的代碼。(舉個簡單的例子,就比如你裝了qq影音播放視頻,你能夠同時用QQ影音打開多個視頻同時觀看,這就是多實例,他們共享QQ影音這個主程序)瀏覽器
在Intellij中咱們給web工程部署到tomcat服務器的時候,咱們會有幾個疑惑?
1. 爲何咱們在tomcat的安裝目錄的webapps文件下找不到咱們的工程 ?
2. 爲何咱們明明在tomcat安裝目錄下的conf/server.xml中配置了虛擬目錄,部署項目後仍然找不到路徑。(文件上傳的時候須要配置虛擬目錄接收上傳的文件,不然瀏覽器是沒法訪問咱們上傳的文件如圖片等) 在intellij中應當如何配置虛擬目錄呢?兩種方式,後面會說 tomcat
首先解決第一個問題----------------------------------------------
通常來講,intellij 會默認將web工程的輸出到本工程目錄下爲out目錄中, 也有的是target目錄中。intellij idea使用Tomcat部署項目後並不會把編譯後的項目複製到tomcat的webapps目錄下,可是它會把編譯好的項目路徑告訴Tomcat,讓Tomcat來找到這個項目,其它的項目好比Tomcat的主頁項目ROOT是打不開的,由於intellij idea 只讓Tomcat運行了一個項目.
每一個Tomcat實例都有一個配置ROOT.xml
文件, 路徑/conf/Catalina/localhost/ROOT.xml
,內容以下:服務器
其中,path是指在訪問此項目時,是否須要添加額外的路徑,若是爲空,則直接使用域名或者ip就能夠訪問到該項目:127.0.0.1。這個值在ieda中的Run/Debug Configurations中能夠配置:mvc
docBase是指要運行的項目的部署位置,D:\work\項目
就是個人項目源代碼的位置,target是由maven構建後生成的,D:\work\項目\target\xxx-web
目錄就是maven build完成以後生成的項目,結構以下:app
就是這個文件告訴tomcat去哪裏找編譯後的項目,因此爲何tomcat實例的webapps目錄下沒有項目文件。webapp
對於第二個問題 ----------------------------------------------
intellij idea中本身生成的tomcat實例存儲路徑以下:
C:\Users\{Username}\.IntelliJIdea2017.1\system\tomcat\Unnamed_{Product}_2\conf"
{Username}是你本機名,{Product}是你的工程名 jsp
你每次建的web項目都會分配一個獨立的tomcat的實例,這裏面conf文件夾下一樣有一份tomcat配置文件,intellij在運行的時候用的就是這裏的配置文件,這也是爲何你在tomcat安裝目錄中配置虛擬目錄不起做用的緣由了,吼吼!intellij 運行tomcat時只會依賴你安裝目錄中的lib和bin這兩個文件夾中文件。
下面的是從intellij中部署項目到tomcat中所截取的一段日誌
[2017-08-01 09:42:15,873] Artifact smvc:war exploded: Server is not connected. Deploy is not available.Using CATALINA_BASE:
"C:\Users\chenyuchao\.IntelliJIdea2017.1\system\tomcat\Unnamed_springmvc_2"
注意 ! ! !這裏的catalina_base指向的再也不是tomcat的安裝目錄了,而是咱們項目所配置的tomcat實所在的目錄。
首先在桌面上新建一個文件夾tomcat-ins,而後從tomcat的安裝目錄中複製一些必要的文件到咱們的文件夾,由於lib
和bin
這兩個文件夾內容是全部tomcat實例共享的,不須要複製。
複製過來的文件稍微修改一下,清空一下webapps
,log
和work
目錄內容,並手動建立三個啓動tomcat實例的批處理文件
這些批處理文件內容以下
Tip :啓動前在配置文件中修改一下相關的端口,這樣多個tomcat啓動就不會衝突
最後,部署一個項目到咱們的tomcat服務器上去,固然這裏部署方式有不少種,最簡單的就是部署到tomcat-ins/webapps目錄下,可是貌似在瀏覽器訪問就必須加項目名,吼吼!因此咱們仍是學習intellij部署項目的方式吧,那樣咱們本身也能夠隨便改變訪問根路徑了!!!
第五步 :學習intellij,部署一個項目到咱們的tomcat實例
在tomcat-ins/conf/Catalina/localhost文件夾下(若是沒有該目錄,手動新建)新建一個xml文件
若是你想部署工程在跟目錄下,url訪問形同 http://localhost:8080/ 就能夠直接訪問index.jsp,這個xml文件的名字必須爲ROOT.xml
, 着重強調,這裏的root四個字母必須全大寫
文件內容以下
說明 : path在這裏必須爲空字符,若是不是空字符串也不要緊,不會有影響,建議按照規範來!指的是瀏覽器訪問的uri,docBase 指的是咱們項目所在的文件夾。
既然這裏的docBase只要指向的是咱們的工程目錄就能夠隨意設置,也就驗證了intellij的項目輸出目錄沒有部署到webapps下的緣由了
----------------------------------------------------------
若是你想部署工程在dir1下,url訪問形同 http://localhost:8080/dir1就能夠直接訪問index.jsp,這個xml文件的名字必須爲dir1.xml,也就是說xml的文件名與你的訪問路徑直接掛鉤
文件內容以下
注意:這裏的path規範化要與你的文件名一致,若是不一致,tomcat8仍會以文件名做爲訪問路徑,忽略此path
----------------------------------------------------------
若是你想部署工程在dir1/dir2下,url訪問形同 http://localhost:8080/dir1/dir2就能夠直接訪問index.jsp,這個xml文件的名字必須爲dir1#dir2.xml,注意以#號分隔多層目錄
文件內容以下
接着雙擊startCatalina.bat就能夠啓動咱們創建的tomcat實例了。
看看Intellij的localhost目錄有什麼,你就知道緣由了,intellij就是這樣作的
錯誤的作法:上面咱們講到,每一個web工程都配置了本身的tomcat配置文件夾,那麼咱們去改它裏面的conf/server.xml,在其host節點中添加一個
這樣的虛擬目錄配置。
結果天然也是無效的,由於每次intellij部署項目對應的tomcat實例就從新生成一邊,圖片中的文件所有刪除再重建,因此咱們修改配置文件無效。
正確的作法:
方法1、intellij中添加虛擬目錄
,糾正一下,圖片中的服務器改成瀏覽器,看看結果
方法2、修改tomcat安裝目錄中server.xml文件,添加一條虛擬目錄配置,再勾選以下配置
勾選上圖,intellij就會在每次部署項目到tomcat上前,將對比本身生成的server.xml文件與tomcat安裝目錄下的server.xml文件不一樣之處,兩個文件合二爲一,做爲最終的tomcat配置文件