Maven的5种scope(加上optional 6种)
2017年08月12日

1. Maven Scope provided 和 optional 的区别

它们的传递性是一样的,都不会传递。

唯一区别在于,例如 一个 war项目,provided的jar 不会被打进war包,而 optional 的jar 会打进war包。

从概念上、本质上来说:

  • provided的包是确实必须要的(如果第三方用到它,则需要第三方提供,如果没有,就会出错)

  • 而optional的本意是,这个包是可选的(无论有没有,都不会出错)


2. Maven的5种scope对于3种class有否有效

   scope    \   classcompileruntimetestexample
compile
YYYspring-core
runtime-
YYjdbc驱动
providedY
-Yservlet-api
system
Y-
Y本地jar包
test-
-Yjunit

从中可以看出:

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包