Maven的5种scope(加上optional 6种)
1. Maven Scope provided 和 optional 的区别
它们的传递性是一样的,都不会传递。
唯一区别在于,例如 一个 war项目,provided的jar 不会被打进war包,而 optional 的jar 会打进war包。
从概念上、本质上来说:
provided的包是确实必须要的(如果第三方用到它,则需要第三方提供,如果没有,就会出错)
而optional的本意是,这个包是可选的(无论有没有,都不会出错)
2. Maven的5种scope对于3种class有否有效
scope \ class | compile | runtime | test | example |
compile | Y | Y | Y | spring-core |
runtime | - | Y | Y | jdbc驱动 |
provided | Y | - | Y | servlet-api |
system | Y | - | Y | 本地jar包 |
test | - | - | Y | junit |
从中可以看出:
1、provided和system范围scope是一样的,只是system的文件来自本地jar包,而provided的来自maven仓库。
2、所有scope的都能在test-class下使用
3、compile 和 runtime 的典型区别案例就是jdbc驱动,jdbc驱动编译时不需要,但是运行时需要。
另外,Eclipse和Idea两种IDE对于maven scope的运用不一样:
例如 main/src下面有个java程序的Main方法,eclipse直接按F11运行,所有scope的jar包都可以依赖到,但是idea下面只有compile和runtime的jar包能用,其他provided、system和test的jar包都会报错——找不到class。
具体参见这篇文章:《Idea下运行找不到class、找不到jar包》