MAVEN的relativePath标签说明
rehoni / 2023-06-23
relativePath标签说明
从父级仓库查找依赖版本
MAVEN构建jar包时候查找顺序:relativePath元素中的地址>本地仓库>远程仓库
父模块配置
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
子模块 <parent> 没有配置 `<relativePath/>`
如果`<dependencies>`中依赖没有指定版本,编译时不能获取父`<dependencyManagement>`中定义的版本。
工作案例
不带,有默认值,就是从父级目录查找pom.xml,也就是../ 目录查找pom,如果这个父级元素不在这个目录就会报错。
但你这个父级肯定不是在这个位置,而是在远程仓库中,或者本地仓库中。 如果带了,而不指定位置,那就是只从远程仓库中查找。 如果带了,也指定了位置,那就是先从指定位置查找,然后本地仓库,最后远程仓库。
不带这个,一般是用于模块项目,就是建一个父项目,然后很多子项目。一般创建模块子项目的时候,是不带的,比如我们pcs9000V1版本是这样的。
但是如果父项目是外部依赖,并不是项目的父项目,才会用到relativePath,比如你创建一个springboot项目的时候,父依赖如果是spring-boot-starter-parent,那么就会加relativePath这个标签,来指定父依赖的来源是远程仓库。 比如我们现在的pcs9000V2、pcs9000V3中的父元素nrcloud,以及nrcloud中的父元素spring-boot-starter-parent。
dependencies与dependencyManagement的区别
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
<!--父项目1-->
<dependencyManagement>
<dependencies>
<!--这个要子项目引入才能使用-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--子项目:添加一个fastjson-->
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
<!--父项目2-->
<dependencies>
<!--这个依赖,子项目一定会依赖,可以直接使用-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
Dependency scope
用来限制Dependency的作用范围的, 影响maven项目在各个生命周期时导入的package的状态。
自从2.0.9后,新增了1种,现在有了6种scope:
-
compile 默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。
-
provided 跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。
使用这个时,不会将包打入本项目中,只是依赖过来。
使用默认或其他时,会将依赖的项目打成jar包,放入本项目的Lib里
when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope
provided
because the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive. -
runtime 表示dependency不作用在编译时,但会作用在运行和测试时
-
test 表示dependency作用在测试时,不作用在运行时。
-
system 跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
-
import (Maven 2.0.9 之后新增) 它只使用在中,表示从其它的pom中导入dependency的配置,例如: This scope is only used on a dependency of type pom in the section. It indicates that the specified POM should be replaced with the dependencies in that POM’s section. Since they are replaced, dependencies with a scope of import do not actually participate in limiting the transitivity of a dependency.