2015-10-20 64 views
0

servlet規範3.0:爲什麼Jersey 2.22在Jersey包中包含「javax.servlet-api-3.0.1」?

Web應用程序類裝載器 類,一個容器使用在WAR加載servlet必須允許 顯影劑裝入以下 正常包含在WAR內庫JAR任何資源加載器使用getResource的Java SE語義。如Java EE許可證 協議中所述,不屬於Java EE產品的servlet容器不應允許 應用程序覆蓋Java SE平臺類(例如,java。*和 中的javax。*名稱空間), Java SE不允許修改。容器 不應該允許應用程序覆蓋或訪問容器的實現 類

所以鑑於這種情況,我不明白爲什麼澤西2.22具有包括在新澤西的javax.servlet-API-3.0.1罐子2.22捆綁。有什麼合理的解釋,爲什麼它在那裏?默認情況下,我相信Glassfish,Tomcat等容器在lib目錄中有自己的servlet-api.jar。

+0

奇怪的是,他們會添加一個「提供」的罐子。當我們使用Maven時,它肯定不會被拉入。我的猜測是,這是因爲Jersey支持注入Servlet組件,'HttpServletRequest/Response','ServletContext'。這只是一個猜測。但即使將jar包含到你的項目中,你也應該確保它不會進入最終的戰爭。你應該總是使用提供的服務器。 –

+0

這就是我認爲......很奇怪。 – mpmp

回答

1

如果選中此link,你會發現這是一個提供的依賴,這意味着依賴是編譯應用程序所需的,而應使用庫時默認提供

Maven documentation解釋provided依賴範圍是如何工作的:

這很像compile [依賴範圍],而是指你 預計JDK或容器,以提供在運行時的依賴。例如,在爲Java Enterprise Edition構建Web應用程序時,可以將Servlet API和相關的Java EE API的依賴性設置爲提供的範圍,因爲Web容器提供了這些類的 。此範圍僅在編譯和 測試類路徑中可用,且不可傳遞。

Jersey 2.22.x bundle包含JAX-RS 2.0 API jar,所有核心Jersey模塊jar以及所有需要的第三方依賴項。

+0

所以,如果我正確地理解了這一點,那麼Jersey的編譯時需要javax.servlet-api.jar。對於運行時,它將使用任何.jar在我的servlet容器(Tomcat-servlet-api.jar)的類路徑中。那是對的嗎? – mpmp

+0

@MiguelPortugal正是!在Jersey 2.22.x的情況下,您的服務器必須提供javax.servlet-api依賴項。 –

+0

好的!奇怪的是我沒有在我的構建路徑中包含javax.servlet-api.jar,但我的應用程序編譯和工作得很好。這可能是因爲我沒有使用那個.jar中的任何東西? – mpmp

相關問題