原創(chuàng)于【模棱博客】 http://www.flammulina.com
如果要編寫Java Web應(yīng)用程序,首先需要做的是做出一個(gè)困難的決定, 我們該選擇哪種服務(wù)器來運(yùn)行Java應(yīng)用程序呢?這是一個(gè)艱難的選擇,因?yàn)槟抢镉性S多優(yōu)秀的選擇,它們之間的差異并不總是顯而易見的。
首先回顧下什么是應(yīng)用程序服務(wù)器?一般來說,應(yīng)用服務(wù)器執(zhí)行Java應(yīng)用程序。您可以在操作系統(tǒng)中啟動(dòng)它們,然后將應(yīng)用程序部署到它們中。將應(yīng)用程序服務(wù)器視為運(yùn)行Java代碼并使其正常運(yùn)行的容器。此外,應(yīng)用程序服務(wù)器還提供了一些可在您自己的代碼中使用的通用基礎(chǔ)結(jié)構(gòu)和功能。
在本文中,我將介紹最流行的免費(fèi)和開源Java應(yīng)用程序服務(wù)器之間的高級別比較。
Tomcat是Apache Software Foundation開發(fā)的與Java Web應(yīng)用程序一起使用的最流行的應(yīng)用程序服務(wù)器。Tomcat的市場份額占到了所有Java應(yīng)用服務(wù)器部署的60%。
然而,關(guān)于Tomcat作為應(yīng)用服務(wù)器的優(yōu)點(diǎn),存在一些混淆(甚至是爭議)。在技術(shù)上稱它為應(yīng)用服務(wù)器……事實(shí)并非如此。
讓我解釋。還記得當(dāng)我說應(yīng)用服務(wù)器為你的應(yīng)用程序提供一些基礎(chǔ)設(shè)施和功能嗎?嗯,這套功能并不是隨意的。稱為Java EE的規(guī)范精確定義了應(yīng)用程序服務(wù)器的功能。因此,嚴(yán)格地說,我應(yīng)該只調(diào)用名稱應(yīng)用程序服務(wù)器通過Java EE兼容性測試的容器。截至今天,Oracle也列出了三個(gè)這樣的容器。
Oracle已將Java EE轉(zhuǎn)移到Eclipse Foundation,現(xiàn)在它在Java EE 8之后被稱為Jakarta EE。此外,現(xiàn)在還有一個(gè)完整EE平臺的Web Profile子集,以及一個(gè)僅支持servlet的Web容器。
實(shí)際上,Tomcat沒有實(shí)現(xiàn)Java EE應(yīng)用程序服務(wù)器所需的所有功能。Tomcat的準(zhǔn)確標(biāo)題是“web服務(wù)器”或“servlet容器”。但即使Tomcat不支持開箱即用的某些Java EE功能,您仍然可以使用大多數(shù)這些功能。您只需將它們作為應(yīng)用程序中的其他第三方依賴項(xiàng)包含在內(nèi)。
因此,Tomcat是成熟的,文檔齊全的,也是使用最廣泛的Java應(yīng)用程序服務(wù)器。憑借良好的文檔以及在互聯(lián)網(wǎng)上關(guān)于它的教程,Tomcat幾乎在所有Java Web應(yīng)用程序中都是應(yīng)用服務(wù)器中最有利的競爭者。
Jetty 是另一個(gè)應(yīng)用程序服務(wù)器(由Eclipse Foundation開發(fā)),從技術(shù)上講,它不是一個(gè)功能齊全的Java EE容器。就像Tomcat一樣,它缺乏對許多Java EE功能的支持。就像Tomcat一樣,您仍然可以通過添加其他第三方依賴項(xiàng)來使用大多數(shù)功能。
雖然Jetty的市場份額遠(yuǎn)不及Tomcat的市場份額,但它仍然廣泛應(yīng)用于行業(yè)。它的兩個(gè)主要賣點(diǎn)是緊湊和占地面積小。兩者都使Jetty非常適合受限環(huán)境和嵌入其他產(chǎn)品。
GlassFish是由Oracle開發(fā)的功能齊全且經(jīng)過認(rèn)證的Java EE應(yīng)用服務(wù)器。因此,GlassFish比Tomcat或Jetty更重量級,并且可以說,操作起來有點(diǎn)困難。
事實(shí)上,GlassFish不僅僅是一個(gè)通用的Java EE應(yīng)用服務(wù)器。它是Java EE標(biāo)準(zhǔn)的參考實(shí)現(xiàn)。這意味著GlassFish用于展示Java EE功能,它得到了定義Java EE標(biāo)準(zhǔn)的貢獻(xiàn)。因此,GlassFish將始終首先支持最新的Java EE功能。這是一個(gè)加分項(xiàng)。
GlassFish的缺點(diǎn)是缺乏商業(yè)支持。是的,這篇文章是關(guān)于免費(fèi)和開源應(yīng)用服務(wù)器的,但這仍然是一個(gè)重點(diǎn)。隨著項(xiàng)目的發(fā)展和財(cái)務(wù)上的成功,您可能愿意為應(yīng)用程序服務(wù)器獲得長期支持,安全更新,客戶支持等。這就是商業(yè)支持所提供的,許多公司都會(huì)購買它。因此請記住,如果您將來使用GlassFish并需要商業(yè)支持,則需要遷移到完全不同的應(yīng)用程序服務(wù)器。
WildFly,以前稱為JBoss Application Server,由紅帽 (Red Hat)開發(fā),是另一個(gè)功能齊全且經(jīng)過認(rèn)證的應(yīng)用服務(wù)器。
WildFly相對于GlassFish的最大優(yōu)勢是Red Hat提供了從WildFly到其商業(yè)支持的應(yīng)用服務(wù)器JBoss企業(yè)應(yīng)用程序平臺的簡單遷移路徑。這意味著您可以立即使用WildFly,并在將來快速遷移到JBoss EAP,以獲得商業(yè)支持,如果您確定需要的話。
這是一個(gè)細(xì)致入微的問題。說實(shí)話,答案因項(xiàng)目而異。
如果您不需要Java EE功能(例如,您將使用Spring Framework),那么我會(huì)說使用Tomcat。這是事實(shí)上的行業(yè)標(biāo)準(zhǔn),因此,如果您選擇它,您將有最簡單的時(shí)間查找文檔和示例。但是,如果您已經(jīng)知道將在受限環(huán)境中運(yùn)行應(yīng)用程序,請考慮選擇Jetty,因?yàn)樗加每臻g較小。
如果您計(jì)劃編寫Java EE應(yīng)用程序,那么事情會(huì)變得更加細(xì)微。
正如我已經(jīng)說過的,可以通過包含第三方依賴項(xiàng)來使用Tomcat來運(yùn)行Java EE應(yīng)用程序。因此,如果您知道只使用一小部分Java EE,那么Tomcat仍然是一個(gè)不錯(cuò)的選擇。例如:如果您只需要JPA實(shí)現(xiàn),那么將EclipseLink導(dǎo)入到您的項(xiàng)目中就可以了,您可以愉快地繼續(xù)使用Tomcat。但是,如果您知道您將大量使用Java EE,或者您需要的功能不能作為第三方插件使用,那么請使用WildFly。
總的來說,我建議支持Tomcat,但如果你需要更小的足跡,可以考慮Jetty。否則,如果您需要在項(xiàng)目中使用大量Java EE支持,請使用WildFly。