2017-10-04 157 views
0

我知道PROVIDED依賴項是由容器提供的,應用程序不需要生成這個JAR。 1)所以,我使用JBOSS EAP 7.0.0.GA,並且在這個模塊文件夾中有以下jar:hibernate-core-5.0.9.Final-redhat-1.jar提供依賴關係和JBOSS EAP 7

在我的項目我使用以下依賴性:

<dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.0.9.Final-redhat-1</version> 
     </dependency> 

它工作正常,沒有錯誤。但我明白我應該使用「PROVIDED」範圍,因爲這個jar由容器提供。它爲什麼有效?

2)我有另一個例子。在Jboss Eap 7.0.0.GA中,我有以下jar:jboss-servlet-api_3.1_spec-1.0.0.Final-redhat-1.jar。但在我的項目中,我有以下幾點:

<dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.0.1</version> 
      <scope>provided</scope> 
      <optional>true</optional> 
     </dependency> 

它工作得很好,但我不明白爲什麼。對我來說,正確的依賴關係應該是servlet-api_3.1_spec-1.0.0.Final-redhat-1提供的。爲什麼它也起作用?

回答

0

在構建時,Maven將解析依賴關係並使相關的包可用於編譯器。例如,您的應用程序服務器可能會提供包含類和接口的JAR,但這些類對於編譯器不一定有用,因爲它不知道它們在哪裏。通過向Maven提供依賴關係,您可以讓Maven找到它們自己的這些依賴關係的實現,僅供編譯時使用。

在運行時,如果您已將依賴關係標記爲provided,那麼您的應用程序將使用appserver提供的版本,而不是Maven已知的版本。這可能是一件壞事,但它經常起作用,因爲編譯器確實只需要知道方法簽名,而不需要知道它們的實現。由規範控制的類的方法簽名(例如javax.servlet中的那些類)的方法簽名很少發生更改,因此編譯時JAR與運行時JAR之間的不匹配可能不被注意。與OSGi兼容的JAR不同,爲JEE構建的JAR不包含指定特定兼容依賴項版本的元數據--JEE類加載器將使用他們發現的更好或更差的內容。

但是,您可能會被發現,特別是如果不匹配很嚴重。運行時問題可能非常明顯,例如與缺少類或方法有關的異常,但它們可能很微妙。

因此,在可行的情況下,最好使用與運行時可用版本相同的編譯時版本的依賴關係。對於EAP,我記得紅帽發佈了Maven物料清單(BOM)文件,該文件爲特定的EAP版本指定了所有EAP JAR的所有版本。

+0

你能舉一個真實的例子來更好地瞭解情況嗎? – RonaldoLanhellas

+0

因此,如果我所有的依賴工作都沒有「提供」範圍,爲什麼我需要提供?只是爲了一個輕量級的JAR? – RonaldoLanhellas

+0

如果您將自己的依賴關係添加到JAR中,那麼您將面臨具有相同名稱但不同版本的類可用於應用程序的風險。除非你非常詳細地研究JEE類的加載規則 - 而應用服務器實際上是尊重它的 - 否則告訴哪些類將在運行時加載會很尷尬。所以這不僅僅是一個較輕的JAR,而是在運行時保持一致。 –