關於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查找它
默認的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>