關於intellij下部署tomcat項目的問題?

新手最近改用intellij idea開發web項目,按照網上百度回來的做法把項目部署好之後可以訪問。可是當我去tomcat所在的位置去查看webapp並沒有發現我在intellij下開發的項目,以前用myeclipse開發的時候部署都是直接部署在tomcat下面的,而現在部署卻不知道去哪裡。然後在intellij啟動tomcat後還可以訪問。有個疑問intellij的部署過程到底是怎樣的呢?什麼out目錄什麼的到底是怎樣一個過程。難道當我一個項目完成後想上線還要自己手動去out目錄下把項目複製過去tomcat嗎?我明明已經部署好了,然後在瀏覽器都能訪問我的項目了,可是在tomcat下卻找不到項目,感覺很神奇啊親!很迷糊,請大神不吝賜教


首先說明啊,下面說的東東有一些呢有多種方法,我不是寫說明書(說的好像會寫一樣),嗯,你懂的,不懂也算了,這個不重要。。。

我的Tomcat裝在這個鳥地方的:F:
esourceapache-tomcat-8.0.37

我們先搞一個web應用吧,一個pikaqiu,裡面有一個aaa.jsp,啊,就是下面這樣

可以看到這個pikaqiu在桌面,也就是C:UsersxinxiDesktop

  • 先來說一下虛擬目錄

我們怎麼才能訪問這個aaa.jsp呢,直接把這個pikaqiu複製到tomcat安裝目錄下的webapps下就行了吧

然後把這個tomcat跑起來,訪問http://localhost/pikaqiu/aaa.jsp,後面我就不說了,瀏覽器地址欄里有

現在,我不想把這個pikaqiu複製到webapps目錄下,讓它留在桌面,這要怎麼搞呢?

先把webapps下的刪了啊,還有tomcat安裝目錄下的work目錄也刪了。去Tomcat安裝目錄conf[enginename][hostname]目錄(我這裡enginename是Catalina,hostname是localhost)下建立一個xml文件,注意文件名為映射的虛擬路徑,就是你瀏覽器地址欄裡面要寫的

再把tomcat跑起來

再說一遍啊這玩意兒少說也有4~5種方法,嗯,一定是這樣的。

我突然發現好像還得再說一種方法才行,我特么都寫到下面eclipse了才發現,真是嗶了狗了

這種方法就是修改Tomcat安裝目錄confserver.xml,在元素中增加一個子元素&,然後再訪問http://localhost/abc/aaa.jsp就行了,瀏覽器訪問效果和上面一樣。

  • 現在來搞默認的目錄

上面的訪問都是http://localhost/[虛擬目錄]/aaa.jsp,現在要直接http://localhost/aaa.jsp

webapps下有一個ROOT文件夾,他是幹嘛的?他也是一個web應用啊,我們裝好tomcat之後

這個東西就是那個ROOT了。

現在把pikaqiu複製到webapps下,然後重命名為ROOT,當然你要把它原來的ROOT刪了,或者改成其他名字。再把tomcat跑起來

還和上面一樣,我還想把pikaqiu留在桌面怎麼辦呢(還是和上面一樣先把webapps下的與皮卡丘有關的都刪了啊,再把work也刪了),上面不是建了一個abc.xml,把它重命名為ROOT.xml就ok了,把Tomcat跑起來

再說一下另外一種方法

上面配置虛擬目錄時,最後說的方法是在server.xml中增加一行,現在呢你把path="/abc"改成path=""就行了。然後訪問http://localhost/aaa.jsp就可以了。

  • Tomcat多實例

一般是不是就跑了一個tomcat啊,可以多跑幾個吧,你在C盤下裝了一個tomcat,在D盤下也裝了一個tomcat,把這兩個都跑起來,是不是就是兩個tomcat了(當然埠不能衝突啊)

除了裝兩個tomcat,還有沒有辦法跑兩個呢,是有的,就是多實例啦。我現在的tomcat裝在F:
esourceapache-tomcat-8.0.37的,上面截圖可以看到我沒有指定埠,嗯,我想說的就是這個tomcat監聽的埠是80。

現在我在桌面建一個文件夾,再把F:
esourceapache-tomcat-8.0.37conf複製到這個文件夾中,然後把埠改一下(我改成了9090)

再在這個文件夾中新建一個bat文件,內容大致如下:

set "CATALINA_BASE=%cd%"
set "CATALINA_HOME=F:
esourceapache-tomcat-8.0.37"
set "EXECUTABLE=%CATALINA_HOME%incatalina.bat"
call "%EXECUTABLE%" start

嗯,就是下面這個樣子了

簡單解釋一下,CATALINA_HOME就是你的Tomcat安裝的位置,CATALINA_BASE就是你的這個實例的位置,默認的話這兩個值是一樣的。%cd%是什麼東東呢

現在雙擊這個startup.bat

看到已經啟動成功了,t1目錄下也多了幾個文件夾,現在t1就是一個tomcat實例了(現在訪問http://localhost:9090是沒有東西的,因為t1/webapps下什麼都沒有),你把web應用放到t1/webapps下一樣的

再比如最上面我們在Tomcat安裝目錄conf[enginename][hostname]目錄下弄了一個abc.xml,現在是不是應該到t1conf[enginename][hostname]目錄下弄啦,嗯,一定是這樣的。

到現在為止,老哥,穩。

  • MyEclipse中tomcat

他直接把你的應用複製到Tomcat安裝目錄下的webapps中,然後再把tomcat跑起來,沒毛病。

默認這個Web Content-root和你的項目名是一樣的,可以自己改,然後,唉,沒有然後了,這圖該有的都有了。

  • eclipse中tomcat

這個和MyEclipse不一樣啊,他不是複製到webapps下面的,題主說不知道它部署去了哪裡,其實這個很好搞到啊。在eclipse中新建一個web應用,然後弄一個jsp文件,內容見圖,跑起來就知道它部署到哪裡去了

啊,沒錯,它就在這個目錄裡面

然後再向上一點

是不是熟悉的面孔?我們把皮卡丘複製到這個webapps下面你說能訪問不,很明顯能啊對不對。這就是一個tomcat的實例嘛。

現在有一個問題,我們到在wtpwebapps下瞧瞧

可以看到這裡面有兩個,一個是我們的foo,還有一個ROOT,不過這個ROOT裡面基本上什麼都沒有。如果我們的foo在webapps下,那沒什麼說的對吧,問題就在於它在wtpwebapps下啊,我們是如何訪問到它的呢?去看一下這個tomcat實例的server.xml就知道了

這些東西都是eclipse的插件自己給我們搞的,這個問題完啦。

還有一個問題,eclipse是如何啟動這個tomcat實例的,上面我們自己手動弄tomcat實例的時候弄了一個startup.bat文件,裡面最主要就是配置了CATALINA_BASE對吧,那eclipse又是怎麼搞的呢?這個問題先留著後面一起說。

  • Intellij IDEA中的Tomcat

和上面一樣的辦法可以搞到它部署到哪裡去了

然後和eclipse一樣,也搞了一個tomcat的實例,在下面這個地方

我這裡最後一個目錄叫Unnamed_JavaWeb,這個名字目測是這樣的(具體我不知道),下劃線後面的是項目的名字,啊,我建的這個項目就叫JavaWeb

然後下劃線前面的應該是配置Tomcat時給起的名字,默認是Unnamed

然而我已經改成Tomcat8了啊,唉,不理了,反正不重要。

上面eclipse是怎麼搞的,在server.xml下增加Context元素對吧,IDEA不是這樣的,它是在conf[enginename][hostname]目錄下增加xml文件。看上面的截圖,我直接訪問http://localhost就可以了,這說明,他把我的這個名叫JavaWeb的應用弄成了默認的,按照上面說的,應該在conf[enginename][hostname]目錄下增加一個ROOT.xml吧。啊,它就是這麼搞的

  • IDE是如何啟動tomcat實例的

在說eclipse的時候留的這個問題,Intellij IDEA也是一樣的,它們是如何啟動tomcat實例的。

set "CATALINA_BASE=%cd%"
set "CATALINA_HOME=F:
esourceapache-tomcat-8.0.37"
set "EXECUTABLE=%CATALINA_HOME%incatalina.bat"
call "%EXECUTABLE%" start

這是在幹嘛啊,設置了CATALINA_HOME和CATALINA_BASE,然後用catalina.bat去吧tomcat跑起來。

可以看到這個CATALINA_BASE沒有的話,它默認的值就是CATALINA_HOME對吧。

好,雙擊我們自己寫的startup.bat把我們自己的tomcat實例跑起來,使用jps工具看一看啟動參數,tomcat本身是一個Java程序,運行在Java虛擬機上的,所以你懂的。

在eclipse中啟動tomcat

用jps看一看

在Intellij IDEA中啟動tomcat

最開始也有輸出啊

這個東西是catalina.bat裡面輸出的,後面紅色的是Java日誌輸出的,然而eclipse那個控制台就顯示了Java輸出的東東。

再用jps看一眼吧

啊,寫完了


其實 idea 啟動的 tomcat 的過程很簡單,看一下啟動日誌就都明白了,題主會有這樣的疑惑主要是對 tomcat 不熟悉:

  1. 配置 CATALINA_BASE
  2. 啟動 Tomcat

CATALINA_BASE是 tomcat 配置目錄,具體可以看Tomcat官方文檔 Apache Tomcat 8 (8.5.9) - Introduction,題主的問題也可以在裡面得到解答,詳情請看下面實例。

==============================分割線================================

  1. 下載一個全新的 tomcat 放在C:JavaTomcat-8080,不作任何修改,啟動,默認埠8080

    此時webapps下的項目如下

  2. 在 idea 配置剛剛下載的 tomcat:

    部署項目並更改埠為8111:

  3. 啟動 tomcat,觀察啟動日誌(此時 tomcat 使用埠已經變成8111):

    這時候咱們打開 CATALINA_BASE這個目錄看一下:

    沒發現webapps,再回到 tomcat 的 webapps 目錄,這時候可以看到原來的 ROOT 項目已經被配置換成實例中的 monitor 項目了

============================又一個分割線============================

所以,根據實例觀察咱們可以得出以下結論:

idea 在啟動 tomcat 的時候通過 CATALINA_BASE 修改了logs、conf和work的配置,webapps沒動,如果沒配置子域名就會自動覆蓋原有的ROOT項目


最近寫了一個tomcat的插件,支持社區版,特點就是不需要拷貝項目的web資源到其他目錄,通過修改server.xml來配置contexpath和classpath。在不改變方法簽名都可以做到熱部署,不需要重啟伺服器。修改jsp也會自動更新的。

插件名叫smart tomcat,可以嘗試一下,有問題可以反饋一下。


樓上@木女孩 的回答挺詳細的,我再來補充幾個我踩過的坑

1. 在java文件夾下面的資源文件,如properties xml文件之類的資源 idea打war包部署的時候默認並不會載入,在article裡面可以配置載入

2. tomcat配置的時候把兩個更新都設置成update class and source 否則修改jsp文件或者freemarker之類的模板文件刷新瀏覽器不會有任何卵用

3. 對於maven項目,如果super pom文件中寫了profile,直接啟動會載入第一條,gradle項目同理會載入第一條task

4. 如果是maven或者gradle項目打jar包的時候別從article中配置,它會把所有的依賴也打進去,讓你的jar包非常的大。正確的姿勢是直接使用idea中相對應的插件,或者用批處理命令。

5. 用手機打這麼多字,如果覺得有用請點個贊,有問題想諮詢可以私信。

6. 以上


你在idwea里新建tomcat的時候,已經把tomcat的映射目錄建好了,你可以用idea啟動tomcat的時候,最開始的啟動日誌會列印你的tomcat新建目錄,可以去看看配置!就算是eclipse/myeclipse 也不是直接拷貝你的項目到webapp目錄下吧,我沒有記錯的話!很久沒用這兩個東西了。


推薦閱讀:

你認為IntelliJ IDEA是最智能的IDE嗎?
Intellij IDEA用Swing開發,而eclipse是用IBM優化過的SWT/JFace開發,為什麼性能差這麼多?
Vim 是否能提高編碼效率?

TAG:Java | ApacheTomcat | IntelliJIDEA |