轉自https://blog.csdn.net/leo3070/article/details/88062663
初次用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中應當如何配置虛擬目錄呢?兩種方式,后面會說
首先解決第一個問題----------------------------------------------
一般來說,intellij 會默認將web工程的輸出到本工程目錄下為out目錄中, 也有的是target目錄中。intellij idea使用Tomcat部署項目后並不會把編譯后的項目復制到tomcat的webapps目錄下,但是它會把編譯好的項目路徑告訴Tomcat,讓Tomcat來找到這個項目,其它的項目比如Tomcat的主頁項目ROOT是打不開的,因為intellij idea 只讓Tomcat運行了一個項目.
每個Tomcat實例都有一個配置ROOT.xml
文件, 路徑/conf/Catalina/localhost/ROOT.xml
,內容如下:
-
-
-
<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的安裝目錄中復制一些必要的文件到我們的文件夾,因為lib
和bin
這兩個文件夾內容是所有tomcat實例共享的,不需要復制。
復制過來的文件稍微修改一下,清空一下webapps
,log
和work
目錄內容,並手動創建三個啟動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配置文件