Maven学习-scope

Maven学习-scope

0x01 摘要

这篇文章是学习maven 依赖中的指定打包时机的参数scope

0x02 背景

maven中最常用的依赖某个第三方包,一般我们会这样写:

<dependency>
    <groupId>org.scala-langgroupId>
    <artifactId>scala-libraryartifactId>
    <version>${scala.version}version>
dependency>

但是这个往往会导致我们最终的程序包过于庞大、臃肿,所以需要通过scope参数来控制打包的时机。

0x03 scope

通过maven官方文档我们可以知道,scope被用来限制依赖的传递性以及会影响不同的构建任务使用的classpath,一共有六个scope 参数可选:

  • compile
    默认值。编译后的依赖项在项目所有classpath可用,还会传递这些依赖项给上层项目。
  • provided
    compile很像,但在最终打包的时候会被排除,只在编译和测试的时候可用。也就是说,当你希望在运行时用jdk或者容器来提供这些依赖项就用provided
    provided无传递性。也就是说,如果你依赖的某个jar包,它的某个jar的范围是provided,那么该jar不会在你的工程中依靠jar依赖传递加入到你的工程中。
  • system
    类似provided,但不同的是你必须通过systemPath来显示提供包含此依赖的jar,而不是从仓库中查找下载。
  • runtime
    在运行时和测试时可用,编译时不可用。编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。如jdbc驱动包,是通过class.forName加载。
  • test
    无传递性。
    仅为测试时编译和执行阶段使用。
  • import
    只能在段落中使用。这个值的含义是此依赖项定义的依赖会被指定的pom内的依赖替换。因为这些依赖项被替换了,所以他们并不真正参与到限制依赖传递的工作中。一般import可以用来解决pom单继承的问题。
    下面是一个import的例子:
<dependencyManagement>
   <dependencies>
   	<dependency>
   		<groupId>org.springframework.bootgroupId>
   		<artifactId>spring-boot-dependenciesartifactId>
   		<version>1.3.3.RELEASEversion>
   		<type>pomtype>
   		<scope>importscope>
   	dependency>
   dependencies>
dependencyManagement>

<dependencies>
   <dependency>
   	<groupId>org.springframework.bootgroupId>
   	<artifactId>spring-boot-starter-webartifactId>
   dependency>
dependencies>

项目中就可以写依赖自己公司的标准parent-pom了。

0xFF 参考文档

Introduction to the Dependency Mechanism
使用import scope解决maven继承(单)问题
MAVEN Scope使用

你可能感兴趣的:(版本控制,项目管理)