美文网首页
Maven scope依赖范围

Maven scope依赖范围

作者: AC编程 | 来源:发表于2022-02-17 17:16 被阅读0次

一、Maven scope依赖范围概览

Maven的生命周期存在编译、测试、运行这些过程,那么显然有些依赖只用于测试,比如junit;有些依赖编译用不到,只有运行的时候才能用到,比如mysql的驱动包在编译期就用不到(编译期用的是JDBC接口),而是在运行时用到的;还有些依赖,编译期要用到,而运行期不需要提供,因为有些容器已经提供了,比如servlet-api在tomcat中已经提供了,我们只需要的是编译期提供而已。总结说来,在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。大致有compile、provided、runtime、test、system等几个。

  • compile:默认的scope,运行期有效,需要打入包中

  • provided:编译期有效,运行期不需要提供,不会打入包中

  • runtime:编译不需要,在运行期有效,需要导入包中。(接口与实现分离)

  • test:测试需要,不会打入包中

  • system:非本地仓库引入、存在系统的某个路径下的jar。(一般不使用)

二、scope依赖范围详解

2.1 compile

默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去,该依赖需要参与当前项目的编译、测试、运行、打包。

2.2 provided

provided 表明该依赖已经提供,故只在未提供时才被使用,应用场景是你定义了一个Servlet,此刻得需要Servlet-api.jar 才能编译成功,但是当你达成war 包时,你并不想将 Servlet-api.jar 包进去,因为Tomcat等容器会提供跟compile 类似,说明JDK、容器或使用者会提供这个依赖,如Servlet.jar。这个依赖只作用在** 编译和测试,该依赖会由系统组件提供,不需手动添加,只存在编译、运行、测试阶段,打包是不用包进去,打包阶段做了exclude**动作。provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。

2.3 runtime

runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。编译时该包不参与,运行时参与。

2.4 test

test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

2.5 system

被依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找,需要 systemPath 属性system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径,这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它从参与度来说,与provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用,例如:

<!-- 引入本地jar -->
 <dependency>
     <groupId>com.oppo</groupId>
      <artifactId>opush-server-sdk</artifactId>
      <version>1.0.6</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/src/main/resources/lib/opush-server-sdk-1.0.6.jar</systemPath>
</dependency>


<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

三、maven预定义内置属性

  • ${basedir}表示项目根目录,即包含pom.xml文件的目录;

  • ${version}表示项目版本;

  • {project.basedir}同{basedir};

  • ${project.baseUri}表示项目文件地址;

  • ${maven.build.timestamp}表示项目构件开始时间;

  • {maven.build.timestamp.format}表示属性{maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式

相关文章

  • Maven scope依赖范围

    一、Maven scope依赖范围概览 Maven的生命周期存在编译、测试、运行这些过程,那么显然有些依赖只用于测...

  • Maven开发笔记(一)—— Maven中的依赖作用范围(sco

    1.Maven中的依赖作用范围概述 Maven中使用 scope 来指定当前包的依赖范围和依赖的传递性。常见的可选...

  • Maven笔记—— 依赖作用域 scope

    1.Maven中的依赖作用范围概述 Maven中使用 scope 来指定当前包的依赖范围和依赖的传递性。常见的可选...

  • maven依赖范围,scope标签

    在maven的pom.xml文件中设置dependency标签的时候可以添加一个子标签 这个 标签可以理解为,这个...

  • maven依赖范围scope详解

    背景:在maven的pom.xml配置文件中,依赖有一个可选参数scope,它标识的是依赖的范围,具体是干什么用的...

  • Maven Scope(依赖范围)小总结

    Maven Scope(依赖范围)小总结 先来下比较官方解释: 在Maven的世界中,有很多种classpath,...

  • Maven中Scope含义说明

    转:Maven中Scope含义说明依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中。...

  • 依赖范围scope

    首先Maven在编译项目主代码的时候需要使用一套classpath。其次在编译测试的时候使用的时候会使用另外的cl...

  • 《Maven实战》读书笔记 一(1-6章)

    mvn clean install 依赖范围 传递性依赖和依赖范围 可选依赖 排除依赖 归类依赖 仓...

  • maven依赖

    **依赖范围 scope**1.compile:默认范围,使用此依赖范围对于编译、测试、运行三种 classpat...

网友评论

      本文标题:Maven scope依赖范围

      本文链接:https://www.haomeiwen.com/subject/xcjslrtx.html