学习maven过程中对scope标签有些不理解.主要是对proviede和runtime有的设置有些不理解.查询网上对这两个设置的解释如下:
- provided: 容器或JDK已提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译的classpath中加载和使用,打包的时候不会包含在目标包中。最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。
- runtime: 一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。
关于provided: 根据上面的说法和compile的区别仅仅是打包的时候不会加入到包中,而依赖tomcat或者jdk提供.
关于runtime: 根据上面的说法,不会进行编译,但是打包的时候会加入包中.
- 第一个问题: 使用了provided这个值之后,也进行了打包了. 打好的包是怎么告诉Tomcat和jdk我需要的包的?
- 第二个问题: 使用runtime这个值后.我们知道java代码需要编译后才能使用.但是上面关于runtime的解释是不会进行编译,但是打包的时候加入目标包中.那么如何使用? 都没有编译,怎么使用? 还有就是这个runtime运行时期指的是在哪里运行?本地开发环境还是正式环境?
第一个问题的解:provided表示依赖的jar由容器提供,此种方式可以了解下JAVA的双亲委派机制和Tomcat的线程上下文加载器,类似servlet-api和jsp-api等jar包,在运行的时候会由容器帮忙加载提供了。
第二个问题的解:java在编译时候,很多编译都是基于接口和实现的方式,比如JDBC,你项目编译时候,只要有JDBC的接口就可以了,就能编译过,但是运行的时候,肯定需要有JDBC驱动的实现才能运行。另外,用runtime的地方改成runtime也不会出问题的,只是会有硬编码问题在里面而已。
另外当你做项目时候,不需要区分太多,但是做工具框架的时候,需要注意的多一些。