Maven scope 类型

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可以填任意非空值,但去除这三个属性会报错。

猜你喜欢

转载自czj4451.iteye.com/blog/2034195