maven之父子工程版本控制案例实战,及拓展groupId和artifactId的含义

news2024/12/25 12:37:22

<parent>标签

用于父子工程项目,什么是父子工程?

顾名思义,maven父子项目是一个有一个父项目,父项目下面又有很多子项目的maven工程,当然,子项目下面还可以添加子项目,从而形成一个树形的结构。那么,这么做有什么好处呢?有以下两点:

  • 依赖传递
  • 打包方便

父工程package 需要指定pom
子工程需要声明parent,否则无法使用父pom的依赖

<dependency> 标签

导入依赖
和dependencyManagement 一起出现,指定的版本优先级更高,通常出现在父pom

<parent> & <dependency>区别

通常parent用于做结构管理,声明子工程继承父工程的
A依赖B C继承B

A = B的依赖 + B自定义class
C = B的依赖
image

<dependencyManagement> 标签

版本控制,只声明版本,不进行依赖导入

<modules> 标签

执定子工程,如果不指定,不能识别子工程

版本控制优先级

子项目的版本优先更高
子项目 dependency
子项目 dependencyManagement
父项目 dependency
父项目 dependencyManagement

如果出现同一个pom,多个不同版本的相同依赖,最下方优先级最高

实战案例:

例如我们有如下项目目录
在这里插入图片描述

最外层的pom.xml即为父工程,一般用于控制子工程版本

父pom.xml:

<?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>
	
    <groupId>cn.wolfcode</groupId>
    <artifactId>caro2o</artifactId>
    <version>3.8.3</version>

    <name>caro2o</name>
    <url>http://www.ruoyi.vip</url>
    <description>e店邦o2o平台管理系统</description>
    
    <properties>
        <caro2o.version>3.8.3</caro2o.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <druid.version>1.2.11</druid.version>
        <bitwalker.version>1.21</bitwalker.version>
        <swagger.version>3.0.0</swagger.version>
        <kaptcha.version>2.3.2</kaptcha.version>
        <mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version>
        <pagehelper.boot.version>1.4.1</pagehelper.boot.version>
        <fastjson.version>2.0.8</fastjson.version>
        <oshi.version>6.1.6</oshi.version>
        <commons.io.version>2.11.0</commons.io.version>
        <commons.fileupload.version>1.4</commons.fileupload.version>
        <commons.collections.version>3.2.2</commons.collections.version>
        <poi.version>4.1.2</poi.version>
        <velocity.version>2.3</velocity.version>
        <jwt.version>0.9.1</jwt.version>
    </properties>
	
    <!-- 依赖声明 -->
    <dependencyManagement>
        <dependencies>

            <!-- SpringBoot的依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.5.14</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- 阿里数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- 解析客户端操作系统、浏览器等 -->
            <dependency>
                <groupId>eu.bitwalker</groupId>
                <artifactId>UserAgentUtils</artifactId>
                <version>${bitwalker.version}</version>
            </dependency>

            <!-- SpringBoot集成mybatis框架 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-boot.version}</version>
            </dependency>

            <!-- pagehelper 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
            </dependency>

            <!-- 获取系统信息 -->
            <dependency>
                <groupId>com.github.oshi</groupId>
                <artifactId>oshi-core</artifactId>
                <version>${oshi.version}</version>
            </dependency>

            <!-- Swagger3依赖 -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>${swagger.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.swagger</groupId>
                        <artifactId>swagger-models</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <!-- io常用工具类 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons.io.version}</version>
            </dependency>

            <!-- 文件上传工具类 -->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>${commons.fileupload.version}</version>
            </dependency>

            <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>

            <!-- velocity代码生成使用模板 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>

            <!-- collections工具类 -->
            <dependency>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
                <version>${commons.collections.version}</version>
            </dependency>

            <!-- 阿里JSON解析器 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson.version}</version>
            </dependency>

            <!-- Token生成与解析-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>

            <!-- 验证码 -->
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>

            <!-- 定时任务-->
            <dependency>
                <groupId>cn.wolfcode</groupId>
                <artifactId>caro2o-quartz</artifactId>
                <version>${caro2o.version}</version>
            </dependency>

            <!-- 代码生成-->
            <dependency>
                <groupId>cn.wolfcode</groupId>
                <artifactId>caro2o-generator</artifactId>
                <version>${caro2o.version}</version>
            </dependency>

            <!-- 核心模块-->
            <dependency>
                <groupId>cn.wolfcode</groupId>
                <artifactId>caro2o-framework</artifactId>
                <version>${caro2o.version}</version>
            </dependency>

            <!-- 系统模块-->
            <dependency>
                <groupId>cn.wolfcode</groupId>
                <artifactId>caro2o-system</artifactId>
                <version>${caro2o.version}</version>
            </dependency>

            <!-- 通用工具-->
            <dependency>
                <groupId>cn.wolfcode</groupId>
                <artifactId>caro2o-common</artifactId>
                <version>${caro2o.version}</version>
            </dependency>

            <!-- 业务模块-->
            <dependency>
                <groupId>cn.wolfcode</groupId>
                <artifactId>caro2o-business</artifactId>
                <version>${caro2o.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <modules>
        <module>caro2o-admin</module>
        <module>caro2o-framework</module>
        <module>caro2o-system</module>
        <module>caro2o-quartz</module>
        <module>caro2o-generator</module>
        <module>caro2o-common</module>
        <module>caro2o-business</module>
    </modules>
    <packaging>pom</packaging>


    <dependencies>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

子项目迭代时一般是以相同版本迭代,所以用<caro2o.version>3.8.3</caro2o.version>来统一控制版本

写在<dependencyManagement>标签中的依赖为子项目可选择加载的依赖,若某子项目要加载该依赖则在自己的pom.xml中的dependencies里添加即可,不用再写版本号version,因为都交由父项目统一管理了,而这就避免了不同子项目引用相同依赖时因版本不同而产生冲突的问题。

写在<dependencies>标签中的依赖为子项目必须加载的依赖,下略。


服务启动入口子项目caro2o-admin的pom.xml:

<?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">
    <parent>
        <artifactId>caro2o</artifactId>
        <groupId>cn.wolfcode</groupId>
        <version>3.8.3</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>caro2o-admin</artifactId>

    <description>
        web服务入口
    </description>

    <dependencies>

        <!-- spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 表示依赖不会传递 -->
        </dependency>

        <!-- swagger3-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
        </dependency>

        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.6.2</version>
        </dependency>

         <!-- Mysql驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- 核心模块-->
        <dependency>
            <groupId>cn.wolfcode</groupId>
            <artifactId>caro2o-framework</artifactId>
        </dependency>

        <!-- 定时任务-->
        <dependency>
            <groupId>cn.wolfcode</groupId>
            <artifactId>caro2o-quartz</artifactId>
        </dependency>

        <!-- 代码生成-->
        <dependency>
            <groupId>cn.wolfcode</groupId>
            <artifactId>caro2o-generator</artifactId>
        </dependency>
        <!-- 业务模块-->
        <dependency>
            <groupId>cn.wolfcode</groupId>
            <artifactId>caro2o-business</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.1.RELEASE</version>
                <configuration>
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>   
                <groupId>org.apache.maven.plugins</groupId>   
                <artifactId>maven-war-plugin</artifactId>   
                <version>3.1.0</version>   
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>${project.artifactId}</warName>
                </configuration>   
           </plugin>   
        </plugins>
        <finalName>${project.artifactId}</finalName>
    </build>

</project>

注意:

在这里插入图片描述

比如该用若依框架搭建的demo项目,我要新增一个名为caro2o-business的业务子项目,则需要将该业务子项目作为模块依赖添加到服务启动入口子项目caro2o-admin的pom.xml里,否则服务启动后admin没加载到business模块内的代码,就会出现404或500等一系列错误。

在这里插入图片描述

然后在业务子项目的pom.xml里添加工具子项目等不同模块的依赖,如:

在这里插入图片描述
因为父项目已经控制版本号了,所以这里可以不用再写version。在图中的情况,若整个项目整体迭代而在父项目的pom.xml中升级更改了统一版本号,则会有报错的可能,因为Maven中首先取的是子项目自己pom.xml里的依赖版本号,就会导致引用caro2o-system时和别的子项目版本出现冲突。


拓展:

maven项目的groupId和artifactId什么意思?

首先要知道groupId和artifactId的存在是为了定位到你的项目,所以它们充当着坐标的角色。
groupId:group意思为组,所以理解为是组织Id,也是公司Id,通常它的写法与公司域名类似。一般分三段,即“域.公司名称.子项目”,域指org、com、cn
等,类似计算机网络里学过的,cn指china,com商业,org非盈利组织。
artifactId:即一个具体的项目,命名方式自己决定。

举个某马大型商城项目结构为例,该项目采用了微服务架构,所以使用了聚合方式,即一个大项目下几个小项目(这样是为了便于版本管理):

在这里插入图片描述
例如:
< groupId>com.leyou.parent< /groupId>,其中com为商业标识,leyou为这个乐优商城项目的公司名称,parent是项目名称,但是因为这个项目采用了聚合方式,下面还有许多项目,这个作为最顶层容器,所以起名parent。 < artifactId>leyou</ artifactId >代表这个项目的总名称为leyou。
其下面的子项目命名为 < groupId>com.leyou.user</ groupId>,前两段域和公司名都相同,只是项目那儿放的这个具体的子项目名称。
< artifactId>leyou-user< /artifactId>使用的leyou-user表示该项目是leyou项目下的user子项目,这种方式结构清晰易懂。
采用这种命名后,项目内部结构通常要相对应。
例如:
在这里插入图片描述

这个项目是大项目下每个项目作为一个单独的服务,对于那些可能被其他服务调用的服务,可以再拆分为两个,例如,这里子项目leyou-item因为为被其他服务调用,所以又才分为了interface和service两个子项目,interface对外提供服务调用,service作具体的业务操作。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1145076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPS学习(一):在ROS2中将GPS经纬度数据转换为机器人ENU坐标系,在RVIZ中显示坐标轨迹

文章目录 一、GPS模块介绍二、坐标转换转换原理参数解释&#xff1a; 增加回调函数效果演示 本文记录在Ubuntu22.04-Humbel中使用NMEA协议GPS模块的过程&#xff0c;使用国产ROS开发板鲁班猫(LubanCat )进行调试。 一、GPS模块介绍 在淘宝找了款性价比较高的轮趣科技GPS北斗双…

AD7321代码SPI接口模数转换连接DAC0832输出verilog

名称&#xff1a;AD7321代码12位ADC&#xff0c;SPI接口模数转换连接DAC0832输出 软件&#xff1a;QuartusII 语言&#xff1a;VHDL 代码功能&#xff1a; 使用VHDL语言编写代码&#xff0c;实现AD7321的控制&#xff0c;将模拟信号转换为数字信号&#xff0c;再经过处理后…

fatfs对于exFAT的使用

f_mkfs的介绍 f_mkfs是FatFs库中的一个函数&#xff0c;用于在指定的磁盘上执行格式化操作。它可以用于创建新的文件系统或重新格式化已有的文件系统。 函数原型如下&#xff1a; FRESULT f_mkfs (const TCHAR* path, // 磁盘路径BYTE opt, // 格式化选项DWORD a…

【QT】点击按钮弹出对话框的注意事项

在stack区创建对话框对象 模态对话框&#xff0c;不可以对其他窗口进行操作。 模态窗口用dlg.exec()显示窗口。 问题代码1: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//点击新建按钮&#xff0c;弹出一…

设计模式【Iterator 模式】

Iterator 模式 1.什么是 Iterator 模式 Iterator 模式就是按照顺序遍历数据集合。 2.示例程序 1.Aggregate 接口 Aggregate 接口是要遍历的集合的接口&#xff0c;声明方法 iterator &#xff0c;实现了该接口的类可以通过 iterator 方法遍历数据集合的元素。 public int…

H5游戏分享-全民找房祖名qmxzfzm

H5游戏分享-全民找房祖名qmxzfzm 一开始就比较简单 后面就会越来越难&#xff0c;而且也有时间限制 游戏的源码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,ini…

【神印王座】易军献身为林鑫挡箭,万万没想到林鑫太坑,大跌眼镜

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《神印王座》动漫最新剧集中&#xff0c;龙皓晨离开后&#xff0c;恶魔族新的援兵突然出现&#xff0c;使得队友们面临了前所未有的困境。这次战斗中&#xff0c;易军与圣采儿等人决定正面攻击恶魔统领&#xff0c;这无疑…

JVM基础:字节码文件详解①

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Java虚拟机的组成二、字节码文件的组成2.1 为什么要了解字节码文件&#xff1f;2.2 如何“窥探”字节码文件的奥秘&#xff1f;2.2.1 使用工具打开字节码文件2.…

09循环嵌套

循环嵌套顾名思义循环里面套循环 # 循环嵌套顾名思义循环里面套循环a 1 b 0 while a < 10:# print(1, a)b 1while b < a and b < 10:print("%d*%d%d" % (b, a, a * b), end" ")b 1print()a 1format 格式化运算符 只需要填入数据即可 print(…

Mathtype使用指南01:下载与安装

目录 介绍&#xff1a; 安装 介绍&#xff1a; MathType 是一款广泛用于数学和科学文档创建的强大数学编辑工具。它允许用户轻松地在各种文档类型中插入数学方程、符号和公式&#xff0c;是学术界、工程领域、出版界和教育机构中的专业人士常用的工具。下面是关于 MathType 的…

ChineseChess6 2023.10.28

中国象棋残局&#xff1a;黑一卒一车 这红棋好像也是无解哦

如何使用ffmpeg制作透明背景的视频

最近我们尝试在网页上叠加数字人讲解的功能&#xff0c;发现如果直接在网页上放一个矩形的数字人视频&#xff0c;效果会很差&#xff0c;首先是会遮挡很多画面的内容&#xff0c;其次就是不管使用任何任务背景&#xff0c;画面都和后面的网页不是很协调&#xff0c;如图所示&a…

2-多媒体数据压缩国际标准

文章目录 多媒体数据压缩编码的重要性和分类为什么要压缩?计算: 未压缩音频的数据率简答: 环绕声系统-作业题9(简述7.4.3全景声)计算: 未压缩图像的数据量-作业题10(估计尺寸及容量)计算: 未压缩视频的数据率 为什么能压缩?数据压缩编码的两大类无损压缩算法: LZ77-作业题6-(…

Visual Studio Code的下载与安装

Visual Studio Code&#xff08;简称 VS Code&#xff09;是由 Microsoft 开发的免费、开源的文本编辑器&#xff0c;适用于多种操作系统&#xff0c;包括 Windows、macOS 和 Linux。它的设计目标是成为一款轻量级、高效的代码编辑工具&#xff0c;同时提供丰富的扩展和功能&am…

计算机毕业设计 基于SpringBoot大学生就业服务平台的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【数据结构】交换排序

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 冒泡、快速排序 1. 冒泡排序2. 快速…

Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】

实现网络加载商品数据的功能&#xff1a; 1、在AndroidManifest.xml中声明网络权限&#xff1b; 2、在app/build.gradle中添加okhttp, glide, gson等必需的第3方库&#xff1b; 3、在MainActivity中通过OkHttpClient连接给定的Web服务&#xff0c;获取商品数据&#xff1b;对…

Android笔记(九):Compose组件的状态(一)

在使用Compose定义UI界面时&#xff0c;可以发现界面的变换往往与Compose组件内部的状态相关&#xff0c;当状态值发生变化时&#xff0c;Compose构成的可组合的界面也会刷新发生相应的变化。将在本笔记中将对可组合项的状态的定义、状态提升、状态丢失和状态的保存进行简单介绍…

Linux(Centos)防火墙允许通过端口增加操作记录

1、nginx -t #Nginx配置文件检查 上述截图代表检查没问题 上述截图检查配置文件配置错误&#xff0c;并提示错误文件位置 2、systemctl restart nginx #重启Nginx 重启Nginx失败 3、systemctl status nginx.service #查看Nginx服务状态 80端口被占导致服务启动失败 4、n…

Spring Boot进阶(93):体验式教程:手把手教你整合Spring Boot和Zipkin

&#x1f4e3;前言 分布式系统开发中&#xff0c;服务治理是一个比较重要的问题。为了更好地实现服务治理&#xff0c;需要解决服务跟踪问题&#xff0c;即如何对分布式系统中的服务进行监控和追踪。本文将介绍如何使用Zipkin进行服务跟踪&#xff0c;并结合Spring Boot进行整合…