原文地址:http://www.kanmenzhu.com/?p=309
maven总共有6种scope,分别为:compile,provided,runtime,test,system,import
compile
这是默认scope,如果未指定,则使用此scope。 scope为compile依赖在项目的所有classpath中都可用。 此外,这些依赖将传播到依赖项目。
provided
和compile很像,但表示您希望JDK或容器在运行时提供依赖性。 例如,在为j2ee构建Web应用程序时,您可以将Servlet API和相关Java EE API r的依赖scope设置为provided,因为Web容器(如tomcat,jetty等)提供了这些类。 此scope仅在编译时和测试classpath中可用,并且不会传递。
runtime
此scope表示编译时不需要使用此依赖项,但是在执行时使用。 它在运行时的classpath和测试时classpath中,但不在编译classpath。简单一句话就是编译时不使用这个依赖,但运行和运行测试时会使用。
test
test表示构建、运行应用程序不需要此依赖,仅可用于测试代码的编译和执行阶段。 此scope不具有传递性。
system
和provided的类似,只是您必须提供明确包含它的JAR。 此依赖在中央仓库中并不会存在。这个场景主要是别人丢给你一个jar包,你要使用其中的功能,可以把jar放到代码目录下,加个system依赖,指定下Jar路径。
import
此scope仅在部分中的且type为pom的依赖项上使用。 它表示要把当前pom.xml中中的部分依赖使用import进来的pom文件中的依赖来替换。 虽然当前pom中的部分依赖被替换掉了,但这个并不影响当前pom中的对应依赖之前前的传递属性。这个有点绕,可以悟一下。举例:当前pom.xml中 里有依赖 slf4j-log4j,然后import了另一个依赖里也包含slf4j-log4j,那么就会使用import进来里的slf4j-log4j。
依赖相关的其他一些注意点
依赖使用情况
除此之外,如果想看当前项目有哪些依赖没用到,那么执行:mvn dependency:analyze 看看输出结果 。对于SpringBoot应用需要注意下,可能会提示有些xxx-starter依赖没用到,这是因为代码中没有明确import,但实际是有用的,需要注意下。还有类就是编译增强的插件,例如像lombok这些也是类似情况。
依赖的一些基本原则
无用的依赖坚决不添加。 即在添加maven依赖时,一定要明白使用依赖中的哪些功能或class,而不是不管3721先给加进来再说。
设置适配的scope。 不合适的scope可能会导致包冲突或打出的目标包过于庞大。
适当的使用true 。对于编译期增强类的依赖应添加此项,如上面提到的lombok仅在编译期生效的依赖。
对外提供的api包(自己打的包被别人依赖)需要特别注意:1)前面提到的能不依赖则不依赖。2)api应该纯粹,减少对下游的污染。3)像log这类最多只能依赖到log api而不是把实现全依赖进来且尽可能使用provider。4)对于一些编译增强的插件依赖(如lombok等)应该使用optional 选项减少对下游污染。