1. 程式人生 > 實用技巧 >Intellij idea 的tomcat原理講解

Intellij idea 的tomcat原理講解

初次用idea的小白可能會很感到很神奇,intellij idea部署web專案在瀏覽器不需要輸入專案名就可以直接訪問,很是方便啊。那麼 intellij 是如何實現這一功能的呢?在瞭解其原理之前需要掌握一定的知識哦。

第一步 : 在本機上配置tomcat伺服器,小白看看吧

首先:新增系統變數 CATALINA_HOME : C:\apache-tomcat-8.0.41
其次:新增環境變數 path : %CATALINA_HOME%\bin
--------------------------------------------------------------
啟動 tomcat 伺服器,開啟你的cmd,輸入以下命令
catalina  run    啟動,在原視窗啟動
catalina  start   啟動,會開啟一個新的dos視窗啟動
catalina  stop   停止tomcat伺服器

第二步 : 看看簡短的啟動資訊,對於理解intellij的tomcat很關鍵

C:\Users\chenyuchao>catalina start
Using CATALINA_BASE: “C:\apache-tomcat-8.0.42”
Using CATALINA_HOME: “C:\apache-tomcat-8.0.42”
Using CATALINA_TMPDIR: “C:\apache-tomcat-8.0.42\temp”
Using JRE_HOME: “C:\Java\jdk1.8.0_101”

我們需要關注的是CATALINA_BASE與CATALINA_HOME的區別,這裡雖然表示的路徑是一樣的,配置tomcat多例項的時候就會不一樣了(後面會說).

【官方解釋】
Throughout the docs, you’ll notice there are numerous references to CATALINA_HOME. This represents the root of your Tomcat installation. When we say, “This information can be found in your CATALINA_HOME/README.txt file” we mean to look at the README.txt file at the root of your Tomcat install. Optionally, Tomcat may be configured for multiple instances by defining CATALINA_BASE for each instance. If multiple instances are not configured, CATALINA_BASE is the same as CATALINA_HOME.

意思為 :CATALINA_HOME是Tomcat的安裝目錄,CATALINA_BASE是Tomcat的工作目錄
目的在於 : 當你需要在一臺機器上面部署多個Tomcat例項,但是你又不想建立多個Tomcat的副本,換句話說就是讓這些Tomcat副本擁有自己的工作目錄但是共享Tomcat的程式碼。(舉個簡單的例子,就好比你裝了qq影音播放視訊,你可以同時用QQ影音開啟多個視訊同時觀看,這就是多例項,他們共享QQ影音這個主程式)

第三步 : Intellij idea 的基於我們給tomcat建立了新的例項

在Intellij中我們給web工程部署到tomcat伺服器的時候,我們會有幾個疑惑?
1. 為什麼我們在tomcat的安裝目錄的webapps檔案下找不到我們的工程 ?
2. 為什麼我們明明在tomcat安裝目錄下的conf/server.xml中配置了虛擬目錄,部署專案後仍然找不到路徑。(檔案上傳的時候需要配置虛擬目錄接收上傳的檔案,否則瀏覽器是無法訪問我們上傳的檔案如圖片等) 在intellij中應當如何配置虛擬目錄呢?兩種方式,後面會說
3. 如何去配置intellij在瀏覽器中的訪問路徑?

首先解決第一個問題----------------------------------------------
一般來說,intellij 會預設將web工程的輸出到本工程目錄下為out目錄中, 原理後面說。
對於第二個問題  ----------------------------------------------
intellij idea中自己生成的tomcat例項儲存路徑如下:
C:\Users\{Username}\.IntelliJIdea2017.1\system\tomcat\Unnamed_{Product}_2\conf"
{Username}是你本機名,{Product}是你的工程名

你每次建的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例項

首先在桌面上新建一個資料夾tomcat-ins,然後從tomcat的安裝目錄中複製一些必要的檔案到我們的資料夾,因為libbin這兩個資料夾內容是所有tomcat例項共享的,不需要複製。

複製過來的檔案稍微修改一下,清空一下webappslogwork目錄內容,並手動建立三個啟動tomcat例項的批處理檔案

這些批處理檔案內容如下

runCatalina.bat的程式碼如下 ,,,,,在當前控制檯啟動 %cd%代表當前目錄

set “CATALINA_BASE=%cd%”
set “EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat”
call “%EXECUTABLE%” run
----------------------------------------------------------
startCatalina.bat的程式碼如下,,,,,新開dos視窗啟動

set “CATALINA_BASE=%cd%”
set “EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat”
call “%EXECUTABLE%” start
----------------------------------------------------------
stopCatalina.bat的程式碼如下,,,,,關閉tomcat伺服器

set “CATALINA_BASE=%cd%”
set “EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat”
call “%EXECUTABLE%” stop
pause

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就是這樣做的

附加 : Intellij idea上部署虛擬目錄,解決檔案上傳問題

錯誤的做法:上面我們講到,每個web工程都配置了自己的tomcat配置資料夾,那麼我們去改它裡面的conf/server.xml,在其host節點中新增一個

這樣的虛擬目錄配置。
結果自然也是無效的,因為每次intellij部署專案對應的tomcat例項就重新生成一邊,圖片中的檔案全部刪除再重建,所以我們修改配置檔案無效。

正確的做法:
方法一、intellij中新增虛擬目錄


,糾正一下,圖片中的伺服器改為瀏覽器,看看結果

方法二、修改tomcat安裝目錄中server.xml檔案,新增一條虛擬目錄配置,再勾選如下配置

勾選上圖,intellij就會在每次部署專案到tomcat上前,將對比自己生成的server.xml檔案與tomcat安裝目錄下的server.xml檔案不同之處,兩個檔案合二為一,作為最終的tomcat配置檔案

附加 : 多個專案部署在相同路徑訪問的是哪一個專案?沒事不要這麼幹!!

<1>現在有一種情況就是在webapps中有一個專案A ,資料夾名smvc

<2>在conf\catalina\localhost中有個smvc.xml配置檔案,載入的是專案B,

<3>在conf\server.xml有個context配置,path為/smvc,載入的是專案C,

那麼我們在瀏覽器中輸入http://localhost:8080/smvc訪問的是哪一個專案呢 ?

答案:訪問的是專案C,

三種方式擁有的優先順序順序是 <3>大於<2>,<2>大於<1>

轉自:https://blog.csdn.net/qq_22627687/article/details/76555886