Intellij idea 的tomcat原理講解(轉)

轉自https://blog.csdn.net/leo3070/article/details/88062663web

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

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

  1.  
    首先:添加系統變量 CATALINA_HOME : C:\apache-tomcat-8.0.41
  2.  
    其次:添加環境變量 path : %CATALINA_HOME%\bin
  3.  
    --------------------------------------------------------------
  4.  
    啓動 tomcat 服務器,打開你的cmd,輸入如下命令
  5.  
    catalina  run    啓動,在原窗口啓動
  6.  
    catalina  start   啓動,會打開一個新的dos窗口啓動
  7.  
    catalina  stop   中止tomcat服務器

第二步 : 看看簡短的啓動信息,對於理解intellij的tomcat很關鍵

  1.  
    C:\Users\chenyuchao>catalina start
  2.  
    Using CATALINA_BASE: 「C:\apache-tomcat-8.0.42」
  3.  
    Using CATALINA_HOME: 「C:\apache-tomcat-8.0.42」
  4.  
    Using CATALINA_TMPDIR: 「C:\apache-tomcat-8.0.42\temp」
  5.  
    Using JRE_HOME: 「C:\Java\jdk1.8.0_101」

咱們須要關注的是CATALINA_BASE與CATALINA_HOME的區別,這裏雖然表示的路徑是同樣的,配置tomcat多實例的時候就會不同了(後面會說).apache

  1.  
    官方解釋】
  2.  
    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中應當如何配置虛擬目錄呢?兩種方式,後面會說 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 ,內容以下:服務器

  1.  
     
  2.  
    <?xml version="1.0" encoding="UTF-8"?>
  3.  
    <Context path="" docBase="D:\work\項目\target\xxx-web" />

其中,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實例

首先在桌面上新建一個文件夾tomcat-ins,而後從tomcat的安裝目錄中複製一些必要的文件到咱們的文件夾,由於libbin這兩個文件夾內容是全部tomcat實例共享的,不須要複製。  
這裏寫圖片描述

複製過來的文件稍微修改一下,清空一下webappslogwork目錄內容,並手動建立三個啓動tomcat實例的批處理文件 
這裏寫圖片描述

這些批處理文件內容以下

  1.  
    runCatalina.bat的代碼以下 ,,,,,在當前控制檯啓動 %cd%表明當前目錄
  2.  
     
  3.  
    set 「CATALINA_BASE=%cd%」
  4.  
    set 「EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat」
  5.  
    call 「%EXECUTABLE%」 run
  6.  
    ----------------------------------------------------------
  7.  
    startCatalina.bat的代碼以下,,,,,新開dos窗口啓動
  8.  
     
  9.  
    set 「CATALINA_BASE=%cd%」
  10.  
    set 「EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat」
  11.  
    call 「%EXECUTABLE%」 start
  12.  
    ----------------------------------------------------------
  13.  
    stopCatalina.bat的代碼以下,,,,,關閉tomcat服務器
  14.  
     
  15.  
    set 「CATALINA_BASE=%cd%」
  16.  
    set 「EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat」
  17.  
    call 「%EXECUTABLE%」 stop
  18.  
    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實例就從新生成一邊,圖片中的文件所有刪除再重建,因此咱們修改配置文件無效。 
這裏寫圖片描述

正確的作法: 
方法1、intellij中添加虛擬目錄 
這裏寫圖片描述 
這裏寫圖片描述 
,糾正一下,圖片中的服務器改成瀏覽器,看看結果 
這裏寫圖片描述

方法2、修改tomcat安裝目錄中server.xml文件,添加一條虛擬目錄配置,再勾選以下配置 
這裏寫圖片描述

勾選上圖,intellij就會在每次部署項目到tomcat上前,將對比本身生成的server.xml文件與tomcat安裝目錄下的server.xml文件不一樣之處,兩個文件合二爲一,做爲最終的tomcat配置文件

相關文章
相關標籤/搜索