Intellij idea 的tomcat原理講解(轉)


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

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

第一步 : 在本機上配置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多實例的時候就會不一樣了(后面會說).

  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中應當如何配置虛擬目錄呢?兩種方式,后面會說 

首先解決第一個問題---------------------------------------------- 
一般來說,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中可以配置:

這里寫圖片描述

docBase是指要運行的項目的部署位置,D:\work\項目 就是我的項目源代碼的位置,target是由maven構建后生成的,D:\work\項目\target\xxx-web 目錄就是maven build完成之后生成的項目,結構如下:

這里寫圖片描述

就是這個文件告訴tomcat去哪里找編譯后的項目,所以為什么tomcat實例的webapps目錄下沒有項目文件。


對於第二個問題  ---------------------------------------------- 
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實例的批處理文件 
這里寫圖片描述

這些批處理文件內容如下

  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實例就重新生成一邊,圖片中的文件全部刪除再重建,所以我們修改配置文件無效。 
這里寫圖片描述

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM