1. compile
编译范围。默认scope。
在工程编译(classpath)和打包时(如war, ear等,会包含该jar文件)有效。
2. runtime
运行时范围,用于运行和测试。
编译代码时不需要该jar包,打war包时会被包含到其中,供容器动态加载其中的类。
在面向接口编程中应用广泛,编译的是接口,运行时通过
读取配置文件、
获取注解等途径加载具体实现类并实例化。
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>1.8.3</version>
<scope>runtime</scope>
</dependency>
3. provided
已提供范围。
表明该jar包已由容器(jetty, tomcat等)或JDK提供,只在编译时使用,不会放到war包中。如J2EE规范的servlet-api和jsp-api等jar包,已由servlet容器提供,war包中有不同版本的包会引起版本冲突,导致容器启动失败。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
4. test
测试范围。
供src/test/java目录下的单元测试类编译和运行,不会打包到war包中,如TestNG, JUnit等:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.4</version>
<scope>test</scope>
</dependency>
5. system
系统范围。
当转换ant工程为maven工程时,为了最大程度利用原有类库,减少更改,通过scope的system形式引用原类库路径的jar包。
另外,如果较早的jar包没有版本号,也没有按照maven库的路径规则存放,可以通过此种方式引用:
<dependency>
<groupId>com.sun</groupId>
<artifactId>btrace</artifactId>
<version>1.0</version>
<scope>system</scope><!-- maven从systemPath去找对应的jar包 -->
<systemPath>D:\Program Files\btrace-bin\build\btrace-client.jar</systemPath>
</dependency>
注:当scope为system时,groupId, artifactId和version可以填任意非空值,但去除这三个属性会报错。