[Maven]构建项目与高级特性
有关于安装配置可以看我的另一篇文章:Maven下载安装配置与简介。
构建项目的生命周期和常用命令
这一节的内容熟记即可,要用了认得出来即可。
在Maven出现之前,项目构建的生命周期就已经存在。对项目进行清理、编译、测试、部署等一系列工作的这个过程,就是项目构建的生命周期。早期公司与公司之间,项目与项目之间的构建项目的方式有所不同,Maven对所有的构建过程进行了抽象和统一。
Maven的三个生命周期
这里介绍一下三个生命周期和它们所包含的事件。
清理工作:clean
>pre-clean:执行一些在clean之前的工作。
>clean:移除上一次构建产生的所有文件。
>post-clean:执行一些在clean之后立刻完成的工作。
核心工作:default
这个生命周期的事件很多。可以看下图:
而且在该生命周期里,执行某个事件会先把前面的事件依次执行一次。
产生报告与发布站点:site
>pre-site:执行一些在生成站点文档之前的工作。
>site: 生成项目的站点文档
>post-site:执行一些在生成站点文档之后完成的工作,为部署做准备
>site-deploy:将生成的站点文档部署到特定的服务器上
常用命令
这些是在cmd和powershell这种命令窗口使用的命令。
mvn clean:调用clean生命周期的clean阶段,清理上一次构建项目生成的文件,也就是compile产生的target目录 ;
mvn compile :编译src/main/java中的java代码成可直接运行的class文件 ,编译完成后maven项目会自动创建一个target目录来存储这些文件 ;
mvn test :编译并maven项目的src/test目录下的junit测试代码 ;
mvn package:将项目打包成可发布的文件,如jar或者war包,打包完成后将生成的文件存放在target目录中 ;
mvn install :发布项目到本地仓库 ;
pom.xml配置文件详解
根标签<project>
pom.xml文件的所有标签都在写在根标签<project>里面。
<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"><!-- 其他配置内容 --></project>
在<project>里常看见三个自动生成且被定义的属性:
xmlns:定义该maven项目的命名空间。
xmlns:xsi:定义一个与 XML Schema Instance(XSI)相关的命名空间前缀。xsi是这个命名空间的前缀,它本身并没有特别的含义,只是一个约定俗成的标识,用于关联特定的 XML Schema 验证规则。
xsi:schemaLocation:指定了POM 4.0.0 版本的xsd文件的位置,这用于验证pom.xml文件的结构是否符合 Maven 的规范。
命名空间:一种避免元素名称和属性名称冲突的机制。不同的开发人员或组织可能会使用相同的标签名称来表示不同的概念。例如,数学和化学相关项目里可能都有一个<element>标签,但它们代表完全不同的东西。命名空间就像是给每个开发人员和组织一个独特的 “书架”,将他们的标签和属性分开存放,这样就可以区分相同名称标签的不同含义
一级标签
一级标签有很多,这里讲几个常用的一级标签。
项目坐标(groupId、artifactId、version)
groupId:表示该项目所属的组织或团队的唯一标识符,商务中通常是公司或组织的反向域名。
artifactId:项目的唯一标识符,在groupId下唯一确定一个项目,通常是项目的名称。
version:指定项目的版本号。Maven在依赖管理和项目部署中通过版本号来管理项目的不同发布版本。
<groupId>org.example</groupId>
<artifactId>mavenText</artifactId>
<version>1.0-SNAPSHOT</version>
其中,SNAPSHOT表示这是一个开发中的版本,而不带SNAPSHOT的版本号表示正式发布的版本 。
上面是简单的项目坐标,除此之外,还有父工程子工程的继承关系。
这是项目结构:
其中,untitled还设置成了mavenText的子工程,下面是它的项目坐标:
<parent><groupId>org.example</groupId><artifactId>mavenText</artifactId><version>1.0-SNAPSHOT</version><relativePath/>
</parent>
这样的话父类所有的数据都会进入子类(比如所有加的第三方依赖)。
而子工程里<relativePath>元素的值留空则表示在这个示例中,Maven将查找父项目的POM文件,不需要额外的路径,这样可以避免去Maven仓库查找。当然,这种情况你不必要去刻意写出来,因为maven中不写relativePath的值,默认为../pom.xml,即查找父工程的pom.xml配置文件。
在父工程里面,也会通过<modules>标记子工程:
项目配置<properties>
<project><properties><!-- 项目的Java源码编译版本 --><maven.compiler.source>8</maven.compiler.source><!-- 项目的目标编译版本 --><maven.compiler.target>8</maven.compiler.target><!-- 源代码文件的字符编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>//其他配置</project>
有些地方可能还会看到<properties>里面还有<java.version>标签,该标签用于指定项目所使用的 Java 版本,方便统一管理项目 Java 版本的配置。
默认会有的标签只有上面里面三个。
依赖管理<dependencies>
主要用于maven的依赖管理,在这里,你可以定义当前项目所需要依赖的jar包。定义之后,会优先在本地仓库进行查找,本地仓库没有,回去中央仓库查找。
有关于jar包的maven坐标获取方式,可以看我开头放置的文章链接,查看目录,找到《Maven简介》下的《maven依赖管理》,有详细说明。
<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>...<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.9.RELEASE</version></dependency>...</dependencies></project>
groupId是maven官方给出的, 用于标识该依赖(jar包)所属的组织或者项目组,它遵循一种类似反向域名的命名规则,确保在全球范围内不同组织开发的库不会产生命名冲突。
artifactId是该依赖(jar包)的名字。
version是该依赖的版本,就像IDEA有2019、2024各种版本一样。
Maven高级特性
maven的高级特性有三个,分别为依赖管理、模块化和聚合。其中,依赖管理的一部分:依赖导入 在刚刚已经讲过,这部分不重复赘述。
依赖管理
依赖传递
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,根据maven项目依赖的特征可以知道项目C也依赖A。
自己写的项目需要打包后安装到本地仓库中,内容较多且与本文主要内容有点差别,为了文章内容不冗余,以后我会单独开一遍文章讲解。
这里用现成实例来举例。Web项目常常会依赖spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果在我们的web项目中间接依赖了spring-aop、spring-beans等
依赖冲突
何为依赖冲突?
刚刚讲到了,项目和项目之间会间接依赖,假如我项目A依赖了servlet-api包,项目B也依赖了servlet-api包,但是B还依赖了项目A。这时候就会在servlet-api包处发生依赖冲突。
经典的例子:Web开发里servlet-api和jsp-api包不会在打包文件war里面,因为Tomcat本身就有s这两个的包(还记得初学Tomcat时,从Tomcat的文件里复制这两个jar包么)。
如果有依赖冲突还没有去解决,就会报java.lang.NoSuchMethodError异常。
常见的解决依赖冲突的办法有下面几种:
使用maven自带的依赖调节原则
该原则是自动执行的,不需要我们特意去设置。发生依赖冲突时:
1.在pom.xml文件里面,哪个依赖先声明,就使用那个依赖。
2.优先使用我们自己导入的jar包,依赖中传递的jar包排其次,直接依赖高于间接依赖。
排除依赖
我们需要在maven坐标处添加排除依赖的声明,使用<exclusions>标签和<exclusion>标签
以刚才提到的spring-webmvc举例
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.4.RELEASE</version><!-- 排除依赖的jar包 --><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion></exclusions></dependency>
锁定版本
虽然报依赖冲突异常不一定是不同版本导致的,但依赖冲突主要还是为了避免不同版本导致的相关问题,那么锁定版本也是一种可选方式。
锁定版本需要使用到<dependencyManagement>标签,该标签与<dependencies>同级,也是pom.xml文件的一个一级标签。
<!-- 锁定的jar包版本 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.0.2.RELEASE</version></dependency></dependencies>
</dependencyManagement><!-- 导入jar包时,不需要再设置版本 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency>
</dependencies>
模块化
相信各位伙伴都接触了解maven了,MVC分包等应该也了解了。帮助我们构建项目是maven两大作用之一,通过子工程父工程等方式帮我们整合项目。
继承
在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。在maven工程之间也有继承,子工程继承父工程后,就可以使用在父工程中引入的依赖,以达到消除重复代码的目的。
子工程需要通过pom.xml文件里添加parent标签来设置父工程。
聚合
如何整合子工程?在父工程的pom.xml文件下添加一级标签<modules>,然后在里面标明该父工程的所有子工程,将其他maven工程聚合到一起,便于对这些项目进行统一操作。
例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用<modules>标签将这些工程统一聚合到maven工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
当然,父工程的打包方式一定要设置为pom,我们区分某个maven工程是否是父工程就看这个工程的打包方式是否为pom。
相关文章:

[Maven]构建项目与高级特性
有关于安装配置可以看我的另一篇文章:Maven下载安装配置与简介。 构建项目的生命周期和常用命令 这一节的内容熟记即可,要用了认得出来即可。 在Maven出现之前,项目构建的生命周期就已经存在。对项目进行清理、编译、测试、部署等一系列工作…...
【系统架构设计师】真题论文: 论数据分片技术及其应用(包括解题思路和素材)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2020年 试题1)解题思路论文素材参考Hash 分片原理一致性 Hash 分片原理按照数据范围(Range Based)分片原理项目采用的分片方式的实现过程和效果真题题目(2020年 试题1) 数据分片就是按照一定的规则…...

【bWAPP】XSS跨站脚本攻击实战
别低头,皇冠会掉;别流泪,贱人会笑。 0x01、XSS - Reflected (GET) Low 输入的内容直接输出到页面中: 后台服务端没有对输入的参数进行过滤, 构造一个注入xss payload即可: <script>alert(1)</script> 成功弹窗 Medium 审查…...
Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK
测试平台: Ubuntu 22.04 sudo apt install ibus-rime 实例 1 :不实用的 实例 2 :实用的 文件使用说明:已经内嵌在文件中了。 ====================================== 实例 1 :不实用的 一共需要 3 个文件,放在用户文件夹下:~/.config/ibus/rime/ # Test A @ Fi…...

多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台
智慧园区作为现代化城市发展的重要组成部分,不仅承载着产业升级的使命,更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化,将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…...

如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案
引言 在数据分析和市场研究领域,Twitter(现在的X)数据一直是重要的信息来源。但是,自从Twitter更改API定价策略后,获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据? …...
第二部分:进阶主题 15 . 安全管理 --[MySQL轻松入门教程]
MySQL 数据库的安全管理是一个多方面的工作,涉及到了解和配置数据库的访问控制、加密、备份与恢复策略、日志记录等多个方面。以下是一些关键点: 1. 用户权限管理 最小权限原则:每个用户应该只被授予完成其工作所需的最低限度的权限。定期审查权限:定期检查用户的权限,确…...
力扣hot100——双指针
283. 移动零 class Solution { public:void moveZeroes(vector<int>& nums) {for (int i 0, j 0; j < nums.size() || i < nums.size(); j) {if (j > nums.size()) {nums[i] 0;continue;}if (nums[j]) nums[i] nums[j];}} }; 双指针,一个指…...
【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)
117. 软件构建(拓扑排序) 继续边看解析边做题,思考时的问题做个如下的总结: 1. 存边用什么数据结构? 在题目中,我们需要存储节点之间的依赖关系(边信息)。选择适合的数据结构非常重…...

【NLP 16、实践 ③ 找出特定字符在字符串中的位置】
看着父亲苍老的白发和渐渐老态的面容 希望时间再慢一些 —— 24.12.19 一、定义模型 1.初始化模型 ① 初始化父类 super(TorchModel, self).__init__(): 调用父类 nn.Module 的初始化方法,确保模型能够正确初始化。 ② 创建嵌入层 self.embedding n…...
费解的开关(bfs + 哈希表 or 递推)
题目描述: 25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。 我们用数字“1”表示一盏开着的灯,用数字“0”表示关…...

C语言——实现求出最大值
问题描述:利用C语言自定义函数求出一维数组里边最大的数字 //利用函数找最大数#include<stdio.h>int search(int s[9]) //查找函数 {int i , max s[0] , max_xia 0;for(i0;i<9;i){if(s[i] > max){max_xia i;max s[max_xia];}}return max; } in…...

基于微信小程序的短视频系统(SpringBoot)+文档
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
Flutter 中 Sliver 的各种装饰器介绍与使用
在 Flutter 中,Sliver 是一种可以在滚动视图中实现自定义效果的组件。Sliver 组件可以根据滚动位置动态改变其外观和行为。本文将介绍几种常用的 Sliver 装饰器及其使用方法。 1. SliverAppBar SliverAppBar 是一个可以随着滚动而变化的应用栏。它可以在用户向下滚…...
电感的基本概念
电感的定义: 电感一般是由导线绕成空芯线圈或带铁芯的线圈而制成。 当线圈中有电流通过时,线圈周围就会产生磁场,当线圈中流过的是直流电流时,线圆周围就会产生固定的磁场,线圈产生的物理现象就是电磁铁,当…...

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程
系统服务 书接上文: linux自启任务详解 演示系统:ubuntu 20.04 开发部署项目的时候常常有这样的场景: 业务功能以后台服务的形式提供,部署完成后可以随着系统的重启而自动启动;服务异常挂掉后可以再次拉起 这个功能在ubuntu系统中通常由systemd提供 如果仅仅需要达成上述的场…...

HTTP协议和接口测试详解
介绍接口测试前我们先来介绍一下HTTP协议,为什么先要介绍HTTP协议呢因为因为我们做接口测试其实就是用测试工具(postman,fiddler,jmeter等等)或代码来模拟用户使用软件的场景,在我们模拟的时候不像平时功能测试时我们有已经开发完…...
vue3【实战】定义全局方法(两种方案)
以全局方法 calculate 为例 src/utils/calculate.ts export default {sum: function (a: number, b: number) {return a b} }方案1: 依赖注入 provide inject main.ts import calculate from ./utils/calculateapp.provide(calculate, calculate)页面中 // esl…...

基于JavaScript的DBUtils增删改查操作实验
1、实验目的 学习和掌握数据库连接池的配置与管理。使用DBUtils进行增删改查操作。按照步骤,掌握并实现使用DBUtils实现增删改查的全过程。 2、实验所用方法 上机实践 3、实验步骤及截图 创建一个数据库表,使用下面sql语句创建数据库表并插入数据&#x…...

初学stm32 --- 系统时钟配置
众所周知,时钟系统是 CPU 的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...