文章目录

  • 一、scope标签的值
  • 二、pom.xml案例
  • 三、scope不同值参与阶段
  • 四、Maven的打包三种插件
  • 五、classifier使用
  • 1、classifier概述
  • 2、使用场景
  • 六、optional标签使用


一、scope标签的值

1、compile:默认值,可省略不写。此值表示该依赖需要参与到项目的编译、测试以及运行周期中,打包时也要包含进去。
2、test:该依赖仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit。
3、runtime:该依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段。
4、provided:该依赖在打包的时候可以不用包含进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude(排除)操作。
5、system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径

二、pom.xml案例

<!-- compile表示在build,test,runtime阶段的classpath下都有依赖关系。 -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>${spring.version}</version>
<!-- <scope>compile</scope> -->
</dependency>
<!--只在test阶段有依赖关系,例如junit -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!-- runtime表示在构建编译阶段不需要,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池 -->
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
	<scope>runtime</scope>
</dependency>
<!--provided表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<!-- system 有些你依赖的jar包可能是没有maven坐标的,它完全不在maven体系中,这时候你可以把它下载到本地硬盘,然后通过system来引用 -->
<!-- 不过不推荐使用system,因为一个项目的pom.xml如果使用了scope为system的depend后,会导致传递依赖中断,即所有其他依赖本项目的项目都无法传递依赖了。-->
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>alipay-sdk-java</artifactId>
     <version>java20171012102412</version>
     <scope>system</scope>
   <systemPath>${project.basedir}/libs/alipay-sdk-java20180309170622.jar</systemPath>
</dependency>

三、scope不同值参与阶段

  • compile,依赖参与项目的编译、运行、打包,都会参与;
  • test,仅参与测试时候的编译、运行,不会打包进去项目中;
  • runtime,参与项目的运行和打包,不会参与编译;
  • provider,参与编译、运行、不会打包到项目中,其他设施会提供;
  • system,参与编译、运行、打包时需要自定义;

四、Maven的打包三种插件

  • maven-jar-plugin,默认的打包插件,用来打普通的project JAR包
  • maven-shade-plugin,用来打可执行JAR包,也就是所谓的fat JAR包
  • maven-assembly-plugin,支持自定义的打包结构,也可以定制依赖项等

五、classifier使用

1、classifier概述

classifier通常用于区分从同一POM构建的具有不同内容的构件(artifact)。它是可选的,它可以是任意的字符串,附加在版本号之后。

2、使用场景

  • 场景一:区分基于不同JDK版本的jar包

如果项目依赖,json-lib-2.2.2-jdk13.jar。则XML配置内容如下:
假如这个目录下有以下两个jar包:

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk13</classifier>    
</dependency>

如果项目依赖,json-lib-2.2.2-jdk15.jar。则XML配置内容如下:

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk15</classifier>    
</dependency>
  • 场景二:区分项目的不同组成部分,例如:源代码、javadoc、类文件等。
    如果需要json-lib-2.2.2-jdk15-javadoc.jar。则XML配置内容如下:
<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk15-javadoc</classifier>    
</dependency>

如果需要json-lib-2.2.2-jdk15-sources.jar。则XML配置内容如下:

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk15-sources</classifier>    
</dependency>

六、optional标签使用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>

比如父工程引入依赖,那么子工程不能继承引入spring-boot-devtools
避免依赖冲突,如果是false遇不设置optional那么就会继承引入