maven父工程relativepath标签使用解读

 更新时间:2024年11月13日 10:01:25   作者:code小鱼  
文章主要介绍了在使用Maven构建父子工程时如何通过设置父工程和子工程的pom文件来管理依赖和版本,当子工程是Spring Boot项目时,可以通过关闭`relativePath`标签来继承Spring Boot的父工程,同时在父工程中使用`dependencyManagement`标签来统一管理Spring Boot的依赖版本

1、概述

我们在使用maven构建父子工程时,通常会在父工程中将pom的打包方式设置为pom,然后在pom文件中使用modules标签来声明子工程,我们在子工程的pom文件中使用parent标签来声明自己属于哪个父工程。

这样的好处是可以方便打包和管理依赖。

2、问题

如果我们的子工程是一个springBoot项目,那么我们可以在pom文件中使用parent标签去继承spring-boot的praent工程,这样的好处是我们项目中使用有关spring-boot的依赖可以全由父工程来管理,方便版本统一。

但现在我们的praent标签已经指向了我们自己创建的父工程。

在pom中只允许使用一个praent标签,那还有什么办法呢?

3、答案(方式一)

这是一个父工程的pom文件,该工程下管理了一个model1子工程

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>mavenParent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>model1</module>
    </modules>

</project>

子工程pom文件:我们可以看到我们的父工程是声明的spring-boot-starter-parent,而不是我们自己的父工程,其实这样也可以被我们自己的父工程所管理,因为我们在父工程中使用了modules标签。

这里有一个关键点:我将relativePath标签关闭了,也就是置空.(该标签必须置空,不写会使用默认值也会报错)

如果你是使用idea创建的maven工程,手动勾选了springboot,那么在relativePath标签旁边会注释一段话:在本地仓库查找依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>model1</artifactId>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath /><!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!-- 这里不需要指定版本号,版本由上面的父工程管理了 -->
        </dependency>
    </dependencies>

</project>

4、详解

relativePath标签含义:指定父工程的pom文件路径

如果你不使用这个标签,那他的默认值是<relativePath>../pom<relativePath>。也就是指向当前模块的上一级目录中的pom文件,也就是我们自己声明的父工程。

他的查找顺序为:relativePath元素中的地址–本地仓库–远程仓库。如果标签指定的地址找不到他就会去本地的maven仓库中找,如果本地仓库没有那就去远程仓库找。

使用<relativePath/>指定一个空地址,他就会去本地仓库中找。

5、番外:方式二

还有一种方式那就是不使用继承spring-boot-starter-parent的方式来管理springboot的依赖,我们可以点进这个spring-boot-starter-parent的pom文件中查看,我们发现它也有一个父工程

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.7.2</version>
  </parent>
  <artifactId>spring-boot-starter-parent</artifactId>
  <packaging>pom</packaging>
  <name>spring-boot-starter-parent</name>
  <description>Parent pom providing dependency and plugin management for applications built with Maven</description>
  

我们再点进这个父工程spring-boot-dependencies看,(这是一部分),我们可以看到其实帮我们管理版本的是这个父工程,它的打包方式也是pom,在properties标签中管理了很多依赖的版本。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.7.2</version>
  <packaging>pom</packaging>
  <name>spring-boot-dependencies</name>
  <description>Spring Boot Dependencies</description>
  <url>https://spring.io/projects/spring-boot</url>
  
  <properties>
    <activemq.version>5.16.5</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.98</appengine-sdk.version>
    <artemis.version>2.19.1</artemis.version>
    <aspectj.version>1.9.7</aspectj.version>
    <assertj.version>3.22.0</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
  </properties>

</project>

既然是这样,还记得dependencyManagement标签吗,这个标签可不是只能在父工程中才可以使用,我们在这里使用该标签来导入spring-boot-dependencies为我们整理的依赖,这样项目中国使用到的有关springboot的依赖就又可以不写版本号了。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>model1</artifactId>
    <packaging>jar</packaging>
    <!--自己的父工程-->
    <parent>
        <groupId>org.example</groupId>
        <artifactId>mavenParent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!-- 这里不需要指定版本号,版本由下面的dependencyManagement管理了 -->
        </dependency>
    </dependencies>

    <!-- 这里dependencyManagement管理版本,只是管理版本,不导入依赖哦! -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用SpringBoot简单实现无感知的刷新 Token功能

    使用SpringBoot简单实现无感知的刷新 Token功能

    实现无感知的刷新 Token 是一种提升用户体验的常用技术,可以在用户使用应用时自动更新 Token,无需用户手动干预,这种技术在需要长时间保持用户登录状态的应用中非常有用,以下是使用Spring Boot实现无感知刷新Token的一个场景案例和相应的示例代码
    2024-09-09
  • 解决打开的idea项目maven不生效问题

    解决打开的idea项目maven不生效问题

    这篇文章主要给大家介绍了关于如何解决打开的idea项目maven不生效问题,最近在配置maven时,发现无论配置几遍,IDEA中的maven配置总会还原成默认的,所以这里给大家分享下解决办法,需要的朋友可以参考下
    2023-07-07
  • Java 从json提取数组并转换为list的操作方法

    Java 从json提取数组并转换为list的操作方法

    这篇文章主要介绍了Java 从json提取出数组并转换为list,使用getJSONArray()获取到jsonarray后,再将jsonArray转换为字符串,最后将字符串解析为List列表,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • PostConstruct注解标记类ApplicationContext未加载空指针

    PostConstruct注解标记类ApplicationContext未加载空指针

    这篇文章主要为大家介绍了@PostConstruct注解标记类ApplicationContext未加载空指针示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • SpringBoot日志从调试到持久化的全解析

    SpringBoot日志从调试到持久化的全解析

    这篇文章主要介绍了Spring Boot项目中日志的用途、使用方法、日志级别、配置以及持久化等方面的内容,日志是开发者排查问题、监控系统运行状态的重要工具,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • java 中数据库连接的JDBC和驱动程序的深入分析

    java 中数据库连接的JDBC和驱动程序的深入分析

    这篇文章主要介绍了java 中数据库连接的JDBC和驱动程序的深入分析的相关资料,需要的朋友可以参考下
    2017-04-04
  • java应用开发之JVM运行时内存分析

    java应用开发之JVM运行时内存分析

    这篇文章主要介绍了java应用开发之JVM运行时内存,文中附含图文示例内容分析非常简要,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • Ubuntu安装jdk8常用方法流程解析

    Ubuntu安装jdk8常用方法流程解析

    这篇文章主要介绍了Ubuntu安装jdk8常用方法流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 基于Java实现Excel列数据提取工具

    基于Java实现Excel列数据提取工具

    这篇文章主要介绍了一个使用Java语言开发的Excel列数据提取工具,该工具借助Apache POI库实现对Excel文件的读取与特定列数据提取功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-06-06
  • Spring Boot在开发过程中常用IDEA插件

    Spring Boot在开发过程中常用IDEA插件

    这篇文章主要为大家介绍了Spring Boot在开发过程中常用IDEA插件,帮助大家提高开发工作效率,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03

最新评论