1. 程式人生 > 程式設計 >maven依賴關係中的<scope>provided</scope>使用詳解

maven依賴關係中的<scope>provided</scope>使用詳解

關於maven依賴中的<scope>provided</scope>使用

scope的其他引數如下:

compile
預設的scope,表示 dependency 都可以在生命週期中使用。而且,這些dependencies 會傳遞到依賴的專案中。適用於所有階段,會隨著專案一起釋出

provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能作用在編譯和測試時,同時沒有傳遞性。

runtime
表示dependency不作用在編譯時,但會作用在執行和測試時,如JDBC驅動,適用執行和測試階段。 test表示dependency作用在測試時,不作用在執行時。 只在測試時使用,用於編譯和執行測試程式碼。不會隨專案釋出。 system跟provided 相似,但是在系統中要以外部JAR包的形式提供,maven不會在repository查詢它

今天開發web的時候,需要用到servlet-api,於是在pom.xml中新增依賴

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>3.0-alpha-1</version>
 </dependency>

通過外掛啟動tomcat的時候,報錯,裡面有一段是這樣的:

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "javax/servlet/ServletContext"
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
 at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
 at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

產生的原因是:tomcat中也有servlet-api包,這樣,發生了衝突

解決方法:新增<scope>provided</scope>,因為provided表明該包只在編譯和測試的時候用,所以,當啟動tomcat的時候,就不會衝突了,完整依賴如下:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>3.0-alpha-1</version>
  <scope>provided</scope>
 </dependency>

到此這篇關於maven依賴關係中的<scope>provided</scope>使用詳解的文章就介紹到這了,更多相關maven依賴<scope>provided</scope>內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!

到此這篇關於maven依賴關係中的<scope>provided</scope>使用詳解的文章就介紹到這了,更多相關maven依賴<scope>provided</scope>內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!