用多了maven的小伙伴,應該快忘了怎么不用maven打war包了吧,我也快忘了,所以趁我還記得,趕緊記錄下來,多年后,當我回憶起往事........
而且網上的教程也太坑了吧,牛頭不搭馬嘴,這害死多少人啊,可能是我理解能力不好吧,怪我。
這里以打包web工程:TomcatFilterTest2為例
第一步:進入打包界面,下面兩種方法,選其一
Ps:有點人的工具欄可能是這樣的:
那是因為你沒有勾選視圖view下的工具條:
第二步,點擊Artifacts,Artifacts是工程組件的意思。可以理解為一個工程中的各個模塊。(ps:如果你要打包的web的工程在idea的tomcat部署運行過,那么就會出現,例如下圖,我要打包的模塊在tomcat運行過,所以會有所記錄,有記錄的建議跳過第三步,直接看第四步)
第三步,手動選擇需要打包的模塊
選擇要打包的模塊:TomcatFilterTest2,然后點擊ok
這樣就出現了剛剛選擇的模塊在Artifacts里面了
第四步:這里的Archive是檔案館的意思,我們打war包就是為了存檔起來嘛,也就是打war的意思,然后選擇我們剛剛選擇的那個模塊
- Name:是war包的名字,可以自己隨意定義
- Type:是類型,這里是Archive的類型,也就是war包的類型
- Output directory:是war包存儲的位置,可以隨意修改,找一個好找的位置存儲即可
- Include in project build:如果把這個選項勾選,說明當當前的這個模塊修改了代碼或者啥的,重新編譯了之后,這個war包也會同步更新修改
- Output Layout:是輸出布局,也就是war包的目錄結構,這里選擇了TomcatFilterTest2模塊,自然war包最后的結構是和TomcatFilterTest2模塊的webapps下的目錄結構是一樣的。
其他的選項作用不是那么大,況且我也不是那么清楚,就不介紹了。至於左下角的提示:META-INF/MANIFEST.MF文件沒找到也不必理會,這個文件里主要存儲了主類,也就是有main方法那個類的所在的位置,這個文件對於java普通工程的打jar包有用,對於打war包,有沒有都不影響,所以這里直接選擇:Apply-->ok
第五步:編譯war包
- All Artifact:對所有模塊進行操作
- Build:進行編譯打包
- Rebuild:重現編譯打包,會刪除原來的war包,然后編譯打包
- Clean:清除war包
- Edit:重新編輯war包的設置
這里我們選擇剛剛的war包,然后點擊Build,查看idea信息窗口:
提示編輯已經成功完成后,可以到打包輸出文件夾查看war包了
對比:
這個iml文件是這個模塊在idea中的一個配置文件,里面主要記錄了這個模塊與當前工程的一個綁定信息(相等於工程給模塊頒發的一個身份證吧),在打war包的時候是不會打包進去的。
對比目錄,可以發現,多了一個classes文件夾,這個classes文件夾是打包的時候自動幫我們創建的,主要存放的是src目錄下對應的類的class文件,當部署到服務器的時候,服務器就會從這個文件夾中讀取可執行的類文件。如果我們自己手動在WEB-INF下建一個classes文件夾的話,那么打包的時候,檢測到已經有這個文件夾就不會再創建,然后把src對應結構下的類編譯,然后把class文件存儲進去。
經過war包與src目錄下的結構對比,知道web默認的目錄結構還是挺重要的,因為在打包的時候,idea會去找src目錄下的對應的類進行編譯。
- 如果src不是源目錄,也可以但是名字必須叫:src,這樣打包的時候也會去src目錄下面找對應的類編譯然后將class文件存儲進classes文件夾中
- 如果不想叫src目錄,也可以,但是必須將這個文件夾定義為源目錄:這樣也可以找得到。但是!如果你既不定義目錄名為src又不定義這個名字不為src的目錄為根目錄,那么打包的時候,就不知道從哪里找文件了,classes文件夾中就會是空的。那將war包部署到服務器的時候就會報找不到文件的錯誤
那么如何設置文件夾為根目錄呢?
對要設置為根目錄的文件夾右鍵:
或者:
順便再說一句,所以我們在創建web項目的時候,在WEB-INF下創建classes目錄是沒有必要的,因為打包的時候會自動幫我們添加上,但是也可以指定項目運行時的編譯輸出路徑吧,方便查看嘛。
war包的內容都是從exploded里面復制的,所以啊如果war包打包發現少東西了,一般都是這個exploded里少了,需要手動粘貼缺少的文件到exploded中,再重新打包。一般我們部署文件到瀏覽器進行測試的時候,都是部署exploed文件,因為這個文件有着war包一樣的目錄結構(其實war包就是按照這個文件的內容打包的,能不一樣嗎),但它更易於修改,在測試的時候我們都需要頻繁的修改代碼,如果使用war包,修改的速度會慢些,並且修改后不太容易看見war包里面的修改情況。所以一般都用exploded類型測試,等到測試完畢后,再進行最后的打war包。至於更進一步的區別,可以去百度一下。
我們還沒打war包的時候,在idea上部署到服務器的就是exploded類型。如果我們在idea模塊中添加了文件,但是在運行的時候發現找不到文件,這個時候就需要到exploded所在的文件看下這個文件在不在,一般都是沒有對這個exploded文件及時進行更新導致的。
jar包和war包的區別可以參考以下鏈接:
https://www.cnblogs.com/lvhouhou/p/11907738.html
既然war包已經打好,那么如何手動部署運行呢?
首先啟動服務器,這里是啟動tomcat服務器,然后復制打包好的war到tomcat目錄下的webapps文件夾下,即可自動解壓war包,並自動運行。
那么,這個原理又是什么,為什么只要復制war包到這里就能自動解壓和自動部署,這就要看tomcat目錄的conf文件夾下的server.xml配置了:
- name:配置主機名
- appBase:這里寫相對於servlet.xml所在文件夾也就是conf文件夾的相對路徑,也就是應用的主要目錄,每次訪問這個主機,都會到這個主要目錄找可執行的web應用,所以要將war包復制到webapps這個文件夾里
- unpackWARs:設置appBase文件夾下的應用是否打包,這里是true,說明了主要我們復制war包過來,就會自動幫我們解壓
- autoDeploy:是否自動部署,這里也是true,只要有web項目,就會自動的幫我們部署到服務器