当前位置: 首页 > news >正文

Maven scope属性解读和使用注意事项

目录

compile

runtime

test

system

provided

import

dependencyManagement标签介绍


maven的scope有哪些:

maven的scope一共包括:compile、runtime、test、system、provided、import。

compile

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.4.1</version><scope>compile</scope></dependency>

compile是默认值,当我们引入依赖时,如果标签没有指定,那么默认就是complie。

compile表示被依赖项目需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,同时打包的时候也会包含进去。是最常用的,所以也是默认的。

runtime

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version><scope>runtime</scope></dependency>

runtime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已。

数据库的驱动包一般都是runtime,因为在我们在编码时只会使用JDK提供的jdbc接口,而具体的实现是有对应的厂商提供的驱动(如mysql驱动),实在运行时生效的,所以这类jar包无需参与项目的编译。

test

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>

test表示只会在测试阶段使用,在src/main/java里面的代码是无法使用这些api的,并且项目打包时,也不会将"test"标记的打入"jar"包或者"war"包。

system

<dependency><groupId>com.mytest</groupId><artifactId>test</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/lib/test-1.0.jar</systemPath></dependency>

system依赖不是由maven仓库,而是本地的jar包,因此必须配合systemPath标签来指定本地的jar包所在全路径。这类jar包默认会参与编译、测试、运行,但是不会被参与打包阶段。如果也想打包进去的话,需要在插件里做配置<includeSystemScope>true</includeSystemScope>。详细如下:

如果你仅仅是这么做了,在你使用SpringBoot打包插件生成jar包的时候,你会发现这个jar包不会被打进去,进而出现错误。如mybatis接口包,其他一般不会有问题。

这个就需要在maven插接中配置一个includeSystemScope属性:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--设置为true,以便把本地的system的jar也包括进来--><includeSystemScope>true</includeSystemScope></configuration></plugin>

还有一点,本地jar依赖的jar,需要重新配置下。

provided

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>

provided表示的是在编译和测试的时候有效,在执行(mvn package)进行打包成war、jar包的时候不会加入,比如:servlet-api,因为servlet-api,tomcat等web服务器中已经存在,如果在打包进去,那么包之间就会冲突

import

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.1.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

dependencyManagement 中type scope默认值如上,可以不加。

dependencyManagement标签介绍

dependencyManagement标签,用法如下:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

为什么要使用这个呢?maven官方给出的解释是:为了统一模块之间的依赖的版本。

有以下特点:

在父pom文件中声明

子模块中需要显式的声明,才会继承该依赖。

子模块如何需要继承该依赖,不需要指明版本,直接从父pom中获取版本号。

举个?:

顶层的父pom.xml文件:

<dependencyManagement>     <dependencies>       <dependency>           <groupId>javax</groupId>              <artifactId>javaee-api</artifactId>          <version>${javaee-api.version}</version>            </dependency>  </dependencies></dependencyManagement>子模块中的pom.xml<!--继承父类--> <parent> <artifactId>父artifactId</artifactId> <groupId>父groupId</groupId> <version>父version</version> <relativePath>父pom.xml的相对路径</relativePath> </parent> <!--依赖关系--> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId></dependency> </dependencies>

dependencies与dependencyManagement区别总结

1、dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

2、dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

http://www.lryc.cn/news/264461.html

相关文章:

  • Vue3使用 xx UI解决布局高度自适应
  • 九牧:科技卫浴,长期主义
  • 中级软件设计师-note-2
  • 解锁商业宝藏:迅软科技答疑保护商业秘密的重要性
  • 【GIT】撤销命令
  • 开发知识点-09Rust
  • Android开发中,百度语音集成之一
  • nodejs连接mongodb报错SyntaxError: Unexpected token .
  • Ubuntu 常用命令之 gunzip 命令用法介绍
  • sun.misc.BASE64Encoder 进行maven打包时报错
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案
  • CSS设计器的使用
  • 3d渲染太慢怎么办?2024效果图云渲染AI加速来袭
  • 指针函数函数指针回调函数相关知识
  • 软件设计模式:六大设计原则
  • Unity闪屏Logo去除
  • Git账户密码http方式的配置
  • 【JUC】三十二、邮戳锁StampedLock
  • 城市里的“蛋壳运动空间”
  • Linux宝塔面板本地部署Discuz论坛发布到公网访问【无需公网IP】
  • Android Canvas状态save与restore,Kotlin
  • python爬取网页图片并下载
  • 亚马逊prime会员日活动是免费的吗?prime day怎么选产品促销?——站斧浏览器
  • 二叉树题目:输出二叉树
  • apache poi_5.2.5 实现对表格单元格的自定义变量名进行图片替换
  • Kafka--Kafka日志索引详解以及生产常见问题分析与总结
  • Vue3-23-组件-依赖注入的使用详解
  • css 美化滚动条
  • Tomcat介绍及使用:构建强大的Java Web应用服务器
  • 怎么定义一套完成标准的JAVA枚举类型