欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

maven scope之privoded

程序员文章站 2022-06-07 19:42:47
...

在maven的dependency标签中privoded是非常常见的一个value:

* compile,缺省值,适用于所有阶段,会随着项目一起发布。 
* provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 
* runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。 
* test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。 
* system,Maven不会在Repository中查找它,一般是系统内指定的jar
如果使用tomcat,项目pom也有了如下的配置:

<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>3.0-alpha-1</version>
</dependency>
就会报错,可能就是NoFindClassError;

产生的原因是:tomcat中也有servlet-api包,这样,发生了冲突

解决方法:添加<scope>provided</scope>,因为provided表明该包只在编译和测试的时候用,所以,当启动tomcat的时候,就不会冲突了;但是如果是运行时是需要改包的,如果添加了该标签,也会包notfindclasserror;

对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。

而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的tomcat容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。


解决方法:先不设置privoded,如果启动报错,在添加标签。