Maven项目之间关系介绍
Maven项目之间的关系
依赖关系
单纯的项目A中需要项目B中的资源,将项目B打成Jar包被A依赖,此时项目A直接调用项目B中资源即可。
项目A和项目B此时形成最基本的依赖关系。
继承关系
需要场景:
如果多个子项目中使用的是相同的依赖或插件,此时我们可以把相同的配置抽取到一个父项目中,进行统一的管理,保持一致性。所以继承关系此时显得比较重要,在java中,继承体现在代码功能上,而maven中的继承则体现在pom.xml,跟功能代码没有关系,当项目A继承了项目B,则项目A拥有了项目B的pom.xml文件中所有依赖。当然继承中也不同的用法和不同的场景。
我们在同级目录创建01_parent、02_child、03_child,一个父项目,两个子项目
01_parent的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>
<!-- 将其作为maven项目的父项目,统一管理子项目的公共依赖 -->
<groupId>org.example</groupId>
<artifactId>01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 父项目的专有打包方式,该种方式,本项目不会被打包成 jar 或 war ,项目里 src 目录下代码无效(可删除), pom.xml 有效,只是作为其它项目的父项目使用. -->
<packaging>pom</packaging>
<properties>
<spring-version>5.2.9.RELEASE</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<!--配置webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
02_child的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>
<parent>
<groupId>org.example</groupId>
<artifactId>01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- <groupId>org.example</groupId> 如果子项目和父项目在同一级目录,使用parent标签表明了父项目坐标后,子项目的groupId可以省去 -->
<artifactId>02_child</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
03_child的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>
<parent>
<groupId>org.example</groupId>
<artifactId>01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>03_child</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
然后我们看看maven项目之间的关系:
我们很明显的看到,两个子项目都成功的拥有了父项目的依赖。maven的基本继承关系就弄完了。
但是实际开发中,我们可能有多个功能不同得子项目,父项目中的依赖并不是每一个子项目都必须全部需要的。这个时候如果子项目拥有了父项目全部依赖就有点说不过去了,甚至可能产生jar包冲突。
这里我们可以使用
<dependencyManagement>
标签来解决我们上述的问题,这个标签的作用其实相当于一个对所依赖 jar 包进行版本管理的管理器.( dependencyManagement 里只是声明依赖,并不实现引入)
这样一来,父项目就像超市,子项目就像客户,父项目将部分不是基本的依赖放入其中,子项目需要就声明即可,不需要的话父项目也不会强人所难。
01_parent的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>
<!-- 将其作为maven项目的父项目,统一管理子项目的公共依赖 -->
<groupId>org.example</groupId>
<artifactId>01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 父项目的专有打包方式,该种方式,本项目不会被打包成 jar 或 war ,项目里 src 目录下代码无效(可删除), pom.xml 有效,只是作为其它项目的父项目使用. -->
<packaging>pom</packaging>
<properties>
<spring-version>5.2.9.RELEASE</spring-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<!--配置webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--dependencyManagement 标签中声明的依赖,只是作为一个 jar 包统一管理的管理器,实际上该标签中声明的依赖不会被引入-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在01_parent这个“超市”中添加了log4j和commons-logging的两个依赖供子项目选择。
此时02_child需要log4j这个依赖:
<?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>
<parent>
<groupId>org.example</groupId>
<artifactId>01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- <groupId>org.example</groupId> 如果子项目和父项目在同一级目录,使用parent标签表明了父项目坐标后,子项目的groupId可以省去 -->
<artifactId>02_child</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
</project>
03_child需要commons-logging这个依赖:
<?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>
<parent>
<groupId>org.example</groupId>
<artifactId>01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>03_child</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
</dependencies>
</project>
看maven项目之间的依赖:
此时02_child没有了commons-logging,03_child没有了log4j,我们已经解决了这个问题。
如果子项目使用的依赖不是父项目的版本,需要在子项目的pom中标明依赖的版本,否则默认使用的是父项目管理的版本。
其实我们这个问题主要是学习<dependencyManagement>
这一标签在父项目中的作用
打包
此时我们对02_child进行打包会报错,具体原因是:
Non-resolvable parent POM for org.example:02_child:1.0-SNAPSHOT: Could not find artifact org.example:01_parent:pom:1.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13@
说子项目解析不了父项目的POM文件,parent.relativePath错误。其实,我们在子类的parent标签中还要加一个<relativePath>
标签,来指明父项目中POM的相对物理路径,这样子项目打包的时候,maven才能工具标签找到父项目的POM地址,不然也不知道子项目的引用从哪来。
项目报错:
子项目打包出错:Invalid packaging for parent POM com.cloud:DemoName:1.0-SNAPSHOT, must be “pom“ but is “jar“。
我们必须在父项目中pom指定打包格式为POM:
<packaging>pom</packaging>
Could not find artifact com.cloud:DemoName:pom:1.0-SNAPSHOT
子项目打包前必须先打包父项目
聚合关系
聚合本身没有实质的内容,随着程序的发展,项目也会越来越大,功能越来越多,开发人员往往会将其划分模块进行开发,功能清晰,设计清晰。maven的聚合特性就是将多个模块聚合在一起构建。并且聚合是建立在继承关系上,父项目的作用除了统一管理子项目的依赖,还做最后统一构建所有子模块,实现一次构建多个项目!
此处做个比喻,有一天我们被要求制作一个“强大”的机器,机器人靠着很多零件组装,团队有4个人,一个管理员,三个开发人员,管理员将其工具包分成三个局部零件交给我们开发,我们每人一个不同的零件开发模块,并在管理员下进行开发。我们开发时,如果零件模块之间没有互相依赖的关系可以并行开发,如果有单向依赖关系那就得看具体需求了。
当我们开发完成后统一交给管理员对我们的局部零件进行组装,最后的结果就是管理员(Maven)统一聚合项目下所有子模块成为最终项目成果。
代码就不演示了,我使用的是MVC分成4个模块(pojo,mapper,serivce,controller),单项依赖感觉不能讲的很清楚,其实自己对聚合关系也只是一知半解,了解基本,还没有进行实质的开发。体会不到聚合关系带来的便利(才学疏浅),要了解详情就要去看别的博客了。
小结
本次是对Maven项目之间三大关系的介绍:
- 最基本的依赖关系:A依赖B
- 继承关系:B和C的公共依赖、部分依赖被A统一管理
- 聚合关系:B、C功能模块开发完,被A统一进行聚合成完整的功能或项目。(聚合关系建立在继承关系上)
Maven项目之间关系介绍的更多相关文章
- Maven项目之间的关系
1. 依赖关系 1.1 标签<dependency>把另一个项目的jar引入到当前项目 1.2 自动下载另一个项目所依赖的其他项目 2. 继承关系. 2.1 父项目是pom类型 2.2 子 ...
- 手动创建Maven项目并建立两个项目之间的依赖关系
用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId -&g ...
- Maven项目关系
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),其中最重要的就是POM文件,可以指定项目类型,项目关系等信息,maven项目之间有三种关系. 依赖 ...
- 如何将 Java 项目转换成 Maven 项目
本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明确的是,用 Maven 管理 Java 项目的确 ...
- 转:如何将 Java 项目转换成 Maven 项目
如何将 Java 项目转换成 Maven 项目 本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明 ...
- Maven学习:项目之间的关系
Maven不仅可以定义一个项目中各个模块之间的关系,还可以更延伸一步定义项目与项目之间的关系. 定义父子项目的好处还是挺多的.
- 查看maven项目的依赖关系 mvn dependency:tree
maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,de ...
- Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)
Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea ...
- Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图
Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项 ...
随机推荐
- 【Android面试查漏补缺】之事件分发机制详解
前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...
- 【LeetCode】39. 组合总和
39. 组合总和 知识点:递归:回溯:组合:剪枝 题目描述 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 ...
- @Valid和@Validated 区别
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...
- Shell-08-文本处理sed
文本处理sed sed:流编辑器,过滤和替换文本 工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并且清空模式空间. 然后再将下一行读入模式空间进行处理输出,以此类推,直到最 ...
- 开发一个分布式IM(即时通信)系统!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 这知识学的,根本没有忘的快呀?! 是不是感觉很多资料,点收藏起来爽.看视频时候嗨.读 ...
- python-scrapy框架学习
Scrapy框架 Scrapy安装 正常安装会报错,主要是两个原因 0x01 升级pip3包 python -m pip install -U pip 0x02 手动安装依赖 需要手动安装 wheel ...
- 【UGUI源码分析】Unity遮罩之RectMask2D详细解读
遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...
- ASP.NET Core:中间件
一.什么是中间件 我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中.而中间件就是用于组成应用程序管道来处理请求和响应的 ...
- bootstrap 冻结表格,冻结表头
需要的文件下载: bootstrap-table:https://github.com/wenzhixin/bootstrap-table bootstrap-table-fiex-column:ht ...
- 深入浅出Mybatis系列(八)---objectFactory、plugins、mappers
1.objectFactory是干什么的? 需要配置吗? MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成.默认的对象工厂需要做的仅仅是实例化 ...