[譯] WAR 還是 JAR,你應該用哪種格式打包?

Maxf發表於2019-03-04

以前,記憶體和磁碟都是稀缺資源。在那時,比較常見的方案是把不用的應用程式部署在同一個平臺上。那是應用伺服器的黃金時代。我早期寫過一篇文章,說的是當前儲存資源趨於廉價會使應用伺服器在一段時間內過時。然而,有一種技術趨勢讓應用伺服器重新迴歸主流。

在基礎設施昂貴的情況下,擁有一臺應用伺服器是一件很棒的事情,通過應用程式共享可以大大降低成本。但缺點是,這種方法需要深入地瞭解每個共享相同資源的應用程式的負載情況,還需要資深的系統管理員來部署應用程式,他們需要保證程式在伺服器的相容性。然而對於老一輩人來說,難道僅僅因為某個應用程式的資源管理沒做好,就只能讓它單獨執行嗎?當基礎設施成本降低時,每個伺服器只部署一個應用程式的做法變得很普遍。那時,人們下一步考慮的是為什麼仍然需要將應用程式伺服器作為專用元件。看上去 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 映像的優化與管理。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃

相關文章