Maven 依赖管理 学习
目录
Maven 依赖管理
可传递性依赖发现
依赖范围
依赖管理
Maven 自动化部署
问题描述
解决方案
修改项目的 pom.xml
Maven Release 插件
Maven Web 应用
创建 Web 应用
构建 Web 应用
部署 Web 应用
Maven 依赖管理
Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。
可传递性依赖发现
一种相当常见的情况,比如说 A 依赖于其他库 B。如果,另外一个项目 C 想要使用 A ,那么 C 项目也需要使用库 B。
Maven 可以避免去搜索所有所需库的需求。Maven 通过读取项目文件(pom.xml),找出它们项目之间的依赖关系。
我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。
通过可传递性的依赖,所有被包含的库的图形会快速的增长。当有重复库时,可能出现的情形将会持续上升。Maven 提供一些功能来控制可传递的依赖的程度。
| 功能 | 功能描述 |
|---|---|
| 依赖调节 | 决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。 |
| 依赖管理 | 直接的指定手动创建的某个版本被使用。例如当一个工程 C 在自己的依赖管理模块包含工程 B,即 B 依赖于 A, 那么 A 即可指定在 B 被引用时所使用的版本。 |
| 依赖范围 | 包含在构建过程每个阶段的依赖。 |
| 依赖排除 | 任何可传递的依赖都可以通过 "exclusion" 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 "被排除的"。 |
| 依赖可选 | 任何可传递的依赖可以被标记为可选的,通过使用 "optional" 元素。例如:A 依赖 B, B 依赖 C。因此,B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。 |
依赖范围
传递依赖发现可以通过使用如下的依赖范围来得到限制:
| 范围 | 描述 |
|---|---|
| 编译阶段 | 该范围表明相关依赖是只在项目的类路径下有效。默认取值。 |
| 供应阶段 | 该范围表明相关依赖是由运行时的 JDK 或者 网络服务器提供的。 |
| 运行阶段 | 该范围表明相关依赖在编译阶段不是必须的,但是在执行阶段是必须的。 |
| 测试阶段 | 该范围表明相关依赖只在测试编译阶段和执行阶段。 |
| 系统阶段 | 该范围表明你需要提供一个系统路径。 |
| 导入阶段 | 该范围只在依赖是一个 pom 里定义的依赖时使用。同时,当前项目的POM 文件的 部分定义的依赖关系可以取代某特定的 POM。 |
依赖管理
通常情况下,在一个共通的项目下,有一系列的项目。在这种情况下,我们可以创建一个公共依赖的 pom 文件,该 pom 包含所有的公共的依赖关系,我们称其为其他子项目 pom 的 pom 父。 接下来的一个例子可以帮助你更好的理解这个概念。

接下来是上面依赖图的详情说明:
-
App-UI-WAR 依赖于 App-Core-lib 和 App-Data-lib。
-
Root 是 App-Core-lib 和 App-Data-lib 的父项目。
-
Root 在它的依赖部分定义了 Lib1、lib2 和 Lib3 作为依赖。
App-UI-WAR 的 pom.xml 文件代码如下:
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.companyname.groupname</groupId><artifactId>App-UI-WAR</artifactId><version>1.0</version><packaging>war</packaging><dependencies><dependency><groupId>com.companyname.groupname</groupId><artifactId>App-Core-lib</artifactId><version>1.0</version></dependency></dependencies> <dependencies><dependency><groupId>com.companyname.groupname</groupId><artifactId>App-Data-lib</artifactId><version>1.0</version></dependency></dependencies>
</project>
App-Core-lib 的 pom.xml 文件代码如下:
<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>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
App-Data-lib 的 pom.xml 文件代码如下:
<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>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
Root 的 pom.xml 文件代码如下:
<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>com.companyname.groupname</groupId> <artifactId>Root</artifactId> <version>1.0</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname1</groupId> <artifactId>Lib1</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname2</groupId> <artifactId>Lib2</artifactId> <version>2.1</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname3</groupId> <artifactId>Lib3</artifactId> <version>1.1</version> </dependency> </dependencies> </project>
现在当我们构建 App-UI-WAR 项目时, Maven 将通过遍历依赖关系图找到所有的依赖关系,并且构建该应用程序。
通过上面的例子,我们可以学习到以下关键概念:
- 公共的依赖可以使用 pom 父的概念被统一放在一起。App-Data-lib 和 App-Core-lib 项目的依赖在 Root 项目里列举了出来(参考 Root 的包类型,它是一个 POM).
- 没有必要在 App-UI-W 里声明 Lib1, lib2, Lib3 是它的依赖。 Maven 通过使用可传递的依赖机制来实现该细节。
Maven 自动化部署
项目开发过程中,部署的过程包含需如下步骤:
- 将所的项目代码提交到 SVN 或者代码库中并打上标签。
- 从 SVN 上下载完整的源代码。
- 构建应用。
- 存储构建输出的 WAR 或者 EAR 文件到一个常用的网络位置下。
- 从网络上获取文件并且部署文件到生产站点上。
- 更新文档并且更新应用的版本号。
问题描述
通常情况下上面的提到开发过程中会涉及到多个团队。一个团队可能负责提交代码,另一个团队负责构建等等。很有可能由于涉及的人为操作和多团队环境的原因,任何一个步骤都可能出错。比如,较旧的版本没有在网络机器上更新,然后部署团队又重新部署了较早的构建版本。
解决方案
通过结合以下方案来实现自动化部署:
- 使用 Maven 构建和发布项目
- 使用 SubVersion, 源码仓库来管理源代码
- 使用远程仓库管理软件(Jfrog或者Nexus) 来管理项目二进制文件。
修改项目的 pom.xml
我们将会使用 Maven 发布的插件来创建一个自动化发布过程。
例如,bus-core-api 项目的 pom.xml 文件代码如下:
<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>bus-core-api</groupId><artifactId>bus-core-api</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging> <scm><url>http://www.svn.com</url><connection>scm:svn:http://localhost:8080/svn/jrepo/trunk/Framework</connection><developerConnection>scm:svn:${username}/${password}@localhost:8080:common_core_api:1101:code</developerConnection></scm><distributionManagement><repository><id>Core-API-Java-Release</id><name>Release repository</name><url>http://localhost:8081/nexus/content/repositories/Core-Api-Release</url></repository></distributionManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-release-plugin</artifactId><version>2.0-beta-9</version><configuration><useReleaseProfile>false</useReleaseProfile><goals>deploy</goals><scmCommentPrefix>[bus-core-api-release-checkin]-</scmCommentPrefix></configuration></plugin></plugins></build>
</project>
在 pom.xml 文件中,我们常用到的一些重要元素节点如下表所示:
| 元素节点 | 描述 |
|---|---|
| SCM | 配置 SVN 的路径,Maven 将从该路径下将代码取下来。 |
| repository | 构建的 WAR 或 EAR 或JAR 文件的位置,或者其他源码构建成功后生成的构件的存储位置。 |
| Plugin | 配置 maven-release-plugin 插件来实现自动部署过程。 |
Maven Release 插件
Maven 使用 maven-release-plugin 插件来完成以下任务。
mvn release:clean
清理工作空间,保证最新的发布进程成功进行。
mvn release:rollback
在上次发布过程不成功的情况下,回滚修改的工作空间代码和配置保证发布过程成功进行。
mvn release:prepare
执行多种操作:
- 检查本地是否存在还未提交的修改
- 确保没有快照的依赖
- 改变应用程序的版本信息用以发布
- 更新 POM 文件到 SVN
- 运行测试用例
- 提交修改后的 POM 文件
- 为代码在 SVN 上做标记
- 增加版本号和附加快照以备将来发布
- 提交修改后的 POM 文件到 SVN
mvn release:perform
将代码切换到之前做标记的地方,运行 Maven 部署目标来部署 WAR 文件或者构建相应的结构到仓库里。
打开命令终端,进入到 C:\ > MVN >bus-core-api 目录下,然后执行如下的 mvn 命令。
C:\MVN\bus-core-api>mvn release:prepare
Maven 开始构建整个工程。构建成功后即可运行如下 mvn 命令。
C:\MVN\bus-core-api>mvn release:perform
构建成功后,你就可以可以验证在你仓库下上传的 JAR 文件是否生效。
"We know that in this world, it is important to know facts and truth, but this spirit of inquiry can easily turn into a complaining mood and strong anger, which is not good. We should know the facts, acknowledge them, and use our strengths, rather than simply complain. Complaining cannot find the truth and progress, only by recognizing can we move forward better."
Maven Web 应用
本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目,如何创建、构建、部署以及运行一个 web 应用。
创建 Web 应用
我们可以使用 maven-archetype-webapp 插件来创建一个简单的 Java web 应用。
打开命令控制台,进入到 C:\MVN 文件夹,然后执行以下的 mvn 命令:
mvn archetype:generate "-DgroupId=com.companyname.automobile" "-DartifactId=trucks" "-DarchetypeArtifactId=maven-archetype-webapp" "-DinteractiveMode=false"

Maven 目录结构是标准的,各个目录作用如下表所示:
| 文件夹结构 | 描述 |
|---|---|
| trucks | 包含 src 文件夹和 pom.xml 文件。 |
| src/main/webapp | 包含 index.jsp 文件和 WEB-INF 文件夹. |
| src/main/webapp/WEB-INF | 包含 web.xml 文件 |
| src/main/resources | 包含图片、properties资源文件。 |
pom.xml 文件代码如下:

接下来我们打开 C:\ > MVN > trucks > src > main > webapp > 文件夹,可以看到一个已经创建好的 index.jsp 文件,代码如下:

构建 Web 应用
打开命令控制台,进入 C:\MVN\trucks 目录,然后执行下面的以下 mvn 命令:
mvn clean package

部署 Web 应用
打开 C:\ < MVN < trucks < target < 文件夹,找到 trucks.war 文件,并复制到你的 web 服务器的 web 应用目录,然后重启 web 服务器。
大家这里可以去下载一个Tomcat,之后去配置一下就可以啦
推荐一个博文:
IDEA配置本地tomcat启动项目_fengchao2016的博客-CSDN博客

真的很离谱,当时一直报红色,我还以为我部署的有问题呢

相关文章:
Maven 依赖管理 学习
目录 Maven 依赖管理 可传递性依赖发现 依赖范围 依赖管理 Maven 自动化部署 问题描述 解决方案 修改项目的 pom.xml Maven Release 插件 Maven Web 应用 创建 Web 应用 构建 Web 应用 部署 Web 应用 Maven 依赖管理 Maven 一个核心的特性就是依赖管理。当我们处…...
分享105个NET源码ASP源码,总有一款适合您
分享105个NET源码,总有一款适合您 源码下载链接:https://pan.baidu.com/s/1zFMIHX6juXdR2CaHMEr5mQ?pwdf5hz 提取码:f5hz 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后…...
Web缓存利用分析(三)
导语:前一篇文章介绍了Server Cache Poisoning在实际应用场景下,产生DOS攻击的利用方式。本篇文章则介绍Web Cache Deception在真实场景下的应用方式和测试情况。 前言 前一篇文章介绍了Server Cache Poisoning在实际应用场景下,产生DOS攻击…...
Git合并冲突的根本原因和解决方法
假如您现在正在参与一个团队项目,并取得了实质性的进展。然而,当你准备提交代码的时候,发现团队中的某个人也更改了同一个文件,并且先你一步提交了——您现在遇到了代码冲突问题。而且需要花时间去解决自己的更改与别人的更改之间…...
从C语言到C++⑨(第三章_CC++内存管理)详解new和delete+面试题笔试题
目录 1. C语言动态内存管理 1.1 C/C内存分布 1.2 C语言中动态内存管理的方式 2. C动态内存管理方式 2.1 new/delete操作内置类型 2.2 初始化new数组的问题 2.3 new 和 delete 操作自定义类型 3. operator new与operator delete函数详解 3.1 operator new与operator de…...
阿里云服务器安装宝塔Linux面板教程图解
使用阿里云服务器安装宝塔面板教程,阿里云服务器网以CentOS操作系统为例,安装宝塔Linux面板,先远程连接到云服务器,然后执行宝塔面板安装命令,系统会自动安装宝塔面板,安装完成后会返回面板地址、账号和密码…...
ORA-01555 ORA-22924 快照过旧问题处理
ORA-01555 ORA-22924 快照过旧问题处理 问题描述 使用数据泵导出数据,或在业务功能查询某个表时,可能出现 ORA-01555 ORA-22924 快照过旧的错误: ORA-01555: snapshot too old: rollback segment number with name "" too small…...
Win11系统更新后网络速度变的很慢怎么办?
Win11系统更新后网络速度变的很慢怎么办?有用户将自己的电脑系统升级到了Win11之后,出现了一些问题。电脑在使用中出现了网络速度变慢的情况。而且其它的设备在连接网络后速度是正常的,那么这个问题要怎么解决?来看看以下的方法分…...
了解 XML结构(一)
文章目录 1 XML定义2 了解XML结构3 XML节点类型4 加载读取XML5 小结 1 XML定义 XML是一种可扩展标记语言(Extensible Markup Language, XML),可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 …...
Vue简单语法记录
指令 v-show:展示和隐藏 如图片的展示和隐藏 (底层是其实已经创建了 加了个css属性,display none)v-if:创建和删除 创建和删除,删除就真的没了v-for: 遍历指令 v-for"item in list&…...
matplotlib的安装和使用教程:中文字体及语言参数设置
matplotlib是一个常用的数据可视化库,广泛应用于科学研究、工程设计、金融分析等领域。由于其强大的功能和易用性,matplotlib已经成为了广大科研工作者和数据分析师的必备工具之一。本文将重点介绍matplotlib的安装和允许中文及几种字体的方法。 一、mat…...
mysql深分页
第一种:主键自增id情况: 未改: select * from wx_product_category_info where category_name_cn#{categoryNameCn} and category_type#{categoryType} order by id asclimit #{pageNum}, #{pageSize};在普通的limit条件下,如果…...
【JavaScript由浅入深】常用的正则表达式
【JavaScript由浅入深】常用的正则表达式 文章目录 【JavaScript由浅入深】常用的正则表达式写在前面一、认识正则表达式1.1 正则表达式的概念 二、正则表达式的使用2.1 使用构造函数创建正则表达式2.2 使用字面量创建正则表达式2.3 补充 三、正则表达式常见规则3.1 字符类3.2 …...
QT常用类型字节数组QByteArray及其基本使用
目录 概述特点常见函数QByteArray::append:QByteArray::insert:QByteArray::replace:QByteArray::remove:QByteArray::toHex:QByteArray::fromHex:QByteArray::toBase64:QByteArray::fromBase64…...
APP 兼容性测试是什么?8年测试老鸟告诉你
1、APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑:操作系统、厂…...
Golang每日一练(leetDay0061) 表列序号、阶乘后的零
目录 171. Excel 表列序号 Excel Sheet Column Number 🌟 172. 阶乘后的零 Factorial Trailing Zeroes 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练…...
深度解析C++异常处理机制:最佳实践、性能分析和挑战
C 基础知识 八 异常处理 下篇 一、异常处理实践1 编写高质量代码中的异常处理1.1 只在必要时才使用异常1.2 尽量减小异常的范围1.3 不要隐藏异常1.4 不要在析构函数中抛出异常1.5 使用 RAII 技术来管理资源 2 维护异常类2.1 按照异常类型的功能来定义异常类2.2 继承现有的异常类…...
【Spring事务】Spring事务事件控制,解决业务异步操作
使用背景 在业务中,经常会有这样的需求,在数据库事务提交之后,发送异步消息或者进行其他的事务操作。 例如当用户注册成功之后,发送激活码,如果用户注册后就执行发送激活码,但是在用户保存时出现提交事务…...
Java 中的注释有哪些?
在 Java 中,有三种注释方式:单行注释、多行注释和文档注释。注释是程序中的一种重要的辅助性说明文字,可以增加程序的可读性和可维护性,方便其他程序员阅读和理解代码。 单行注释 单行注释是指以“//”开头的注释,注释…...
yolov4
1 V4版本概述 集各种优秀方案于一身,嫁接了众多主流的目标识别方面的情况。 V4 贡献 3. 数据增强策略分析 BOF Bag of freebies(BOF) Mosiac 数据增强 Mixup 比如将狗和猫的两张图片混合,一半猫,一半狗。 label 也变成 Dog 0.5 , Cat 0…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...
【Java基础】向上转型(Upcasting)和向下转型(Downcasting)
在面向对象编程中,转型(Casting) 是指改变对象的引用类型,主要涉及 继承关系 和 多态。 向上转型(Upcasting) ⬆️ 定义 将 子类对象 赋值给 父类引用(自动完成,无需强制转换&…...
在MobaXterm 打开图形工具firefox
目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前(YUM) sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...
Spring Boot SQL数据库功能详解
Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖(如org.postgresql:postgresql)后,应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息: 数据库URL格…...
【docker】Windows安装docker
环境及工具(点击下载) Docker Desktop Installer.exe (windows 环境下运行docker的一款产品) wsl_update_x64 (Linux 内核包) 前期准备 系统要求2: Windows 11:64 位系统&am…...
