<b>本文講的是[譯] WAR 還是 JAR,你應該用哪種格式打包?,</b>
<b></b>
以前,記憶體和磁盤都是稀缺資源。在那時,比較常見的方案是把不用的應用程式部署在同一個平台上。那是應用伺服器的黃金時代。我早期寫過一篇文章,說的是目前存儲資源趨于廉價會使應用伺服器在一段時間内過時。然而,有一種技術趨勢讓應用伺服器重新回歸主流。
在基礎設施昂貴的情況下,擁有一台應用伺服器是一件很棒的事情,通過應用程式共享可以大大降低成本。但缺點是,這種方法需要深入地了解每個共享相同資源的應用程式的負載情況,還需要資深的系統管理者來部署應用程式,他們需要保證程式在伺服器的相容性。然而對于老一輩人來說,難道僅僅因為某個應用程式的資源管理沒做好,就隻能讓它單獨運作嗎?當基礎設施成本降低時,每個伺服器隻部署一個應用程式的做法變得很普遍。那時,人們下一步考慮的是為什麼仍然需要将應用程式伺服器作為專用元件。看上去 Spring 團隊也得到了相同的結論,因為 Spring Boot 應用的預設模式就是打包成一些可執行的 jar 包,我們稱其為 Fat JARs。這些應用程式可以通過“java -jar fat.jar”的指令運作。是以有句名言:
“用 JAR 包,而不是 WAR 包” - Josh Long
我并不完全同意這個觀點,我認為這個觀點會讓大多數團隊失去應用伺服器管理方面的專業知識。不過,一個支援 Fat JARs 的有力證據表明,自從使用 booting 技術管理應用程式,加載 java 類變得非常容易。例如,使用開發工具,Spring Boot 為兩種類加載器(classloader)提供了同一種處理機制,一種類加載器對應類庫,另一種對應 java 類,是以重新加載一個修改過的類是不需要重新開機整個 jvm — 這個簡潔的技巧讓代碼的更新疊代變得快捷友善。
如果我們認為,應用伺服器提供商仍在使用傳統方式來處理任務的話,那就錯了——多謝 Ivar Grimstad 讓我想到
了這個問題(這是一個訪談的好理由,雖然你不一定對會議感興趣)。Wildlfy、TomEE,以及其他應用伺服器提供商都使用 Fat JARs 打包,但他們和我們有個很大的差別:他們不使用 Spring 之類的開發工具,是以每當修改代碼都需要重新開機整個伺服器。讓代碼快速生效的唯一方法就是在底層進行開發工作,例如為團隊購買正版的 JRebel。然而,現在還有一個理由讓我們選用 WAR 包,那就是使用 Docker。通過提供一個普通的應用伺服器以及 Docker 映象作為基礎映象,在上面加一個 WAR 包就能輕松得到 WAR 包鏡像。目前 JAR 包(暫時)還不能通過這種方式實作。
請注意這裡并不是在比較 Spring Boot 和 JavaEE,而是在比較 JAR 和 WAR,因為用 Spring Boot 可以完美地打出這兩種類型的包。我前面提到現在還有一個問題,那就是當代碼修改之後還是需要重新開機整個 JVM,而不能僅僅重載 java 類 — 但我相信這個問題遲早會解決。
選擇用 WAR 包還是 JAR 包最終取決于公司的實際情況,看公司是更看中開發的快速回報疊代,還是更看重 Docker 映像的優化與管理。
<b>原文釋出時間為:2017年7月13日</b>
<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>