1 回答

TA貢獻1812條經驗 獲得超5個贊
正如Maven 文檔規(guī)定的范圍所提供的:
這很像 compile,但表明您希望 JDK 或容器在運行時提供依賴項。例如,在為 Java Enterprise Edition 構建 Web 應用程序時,您可以將對 Servlet API 和相關 Java EE API 的依賴項設置為提供的范圍,因為 Web 容器提供這些類。此范圍僅在編譯和測試類路徑上可用,并且不可傳遞。
那里已經提到了一個用例:在構建稍后要部署在 JavaEE 應用程序服務器上的 JavaEE 應用程序時,應用程序服務器提供了 javaEE 實現。
因此,要告訴 Maven 您在編譯時需要此依賴項但稍后未打包到項目中,您將使用提供的范圍,例如:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
另一個用例是構建使用不同容器類型的 JavaEE 應用程序。有一個JavaEE EJB 和一個 Web 容器,您需要確保您的類不會被打包/加載到錯誤的容器中,甚至不會被加載到兩個容器中,因為這可能會給您的應用程序和類加載器帶來各種問題。
假設您正在構建一個包含 EJB 模塊和 Web 模塊的應用程序,并且您希望 EJB 在 EJB 容器中運行。您還希望在 web 模塊中使用您的 EJB。由于 EJB 在 EJB 容器中運行,而 Web 模塊在 web 容器中運行,因此您不能簡單地在您的 Web 項目中添加具有作用域 compile 的 EJB-Dependency。因為如果你這樣做,maven 會將 ejb 打包到 war 文件中,而 EJB 最終會出現在 web 容器中。
因此,在您的 Web 應用程序中,您可以將依賴項添加為
<artifactId>my-web</artifactId>
<packaging>war</packaging>
<dependency>
<groupId>your.group</groupId>
<artifactId>my-ejb</artifactId>
<type>ejb</type>
<scope>provided</scope>
</dependency>
這樣你就告訴 maven 你想使用你的 EJB 模塊,但它不應該把它打包到你的 war 文件中,你將確保這個模塊在運行時自己可用。
添加回答
舉報