Maven依赖中scope的runtime和provied的区别及说明
Maven依赖中scope的runtime和provied的区别
<scope>runtime</scope>
runtime 用在 Class.forName(“com.mysql.jdbc.Driver”) 时,compile 编译时不依赖,只有运行时才会依赖。
案例:
当尝试去把 compile -> runtime 后,无法编译成功,因为 runtime 只在运行时使用,编译时不引入,造成有些依赖无法加入。
<scope>provied</scope>
只有编译会使用,程序运行时不需要依赖的。
案例一:
lombok 只在编译时,把 getter、setter 设置好,不需要运行时使用。
案例二:
servlet-api 只在编译时,需要引入,运行时由 tomcat 容器提供。
maven scope provided和runtime的例子
maven常用的scope有compile,provided,runtime,test。
complie
是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系。
test
表示只在test阶段有依赖关系,例如junit
provided
表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>
runtime
表示在构建编译阶段不需要,只在test和runtime需要。
这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。
虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。
例如JDBC连接池:
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> <scope>runtime</scope> </dependency>
spring applicationContext.xml
<!-- mysql --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <!-- Connection Pool --> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${ckm.jdbc.driver}" /> <property name="url" value="${ckm.jdbc.url}" /> <property name="username" value="${ckm.jdbc.username}" /> <property name="password" value="${ckm.jdbc.password}" /> <property name="initialSize" value="6" /> </bean>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
最新评论