Luo Hao

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: