当前位置: 首页 > news >正文

[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]构建项目与高级特性

有关于安装配置可以看我的另一篇文章&#xff1a;Maven下载安装配置与简介。 构建项目的生命周期和常用命令 这一节的内容熟记即可&#xff0c;要用了认得出来即可。 在Maven出现之前&#xff0c;项目构建的生命周期就已经存在。对项目进行清理、编译、测试、部署等一系列工作…...

【系统架构设计师】真题论文: 论数据分片技术及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2020年 试题1)解题思路论文素材参考Hash 分片原理一致性 Hash 分片原理按照数据范围(Range Based)分片原理项目采用的分片方式的实现过程和效果真题题目(2020年 试题1) 数据分片就是按照一定的规则…...

【bWAPP】XSS跨站脚本攻击实战

别低头&#xff0c;皇冠会掉&#xff1b;别流泪&#xff0c;贱人会笑。 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搭建智慧园区视频管理平台

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…...

如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案

引言 在数据分析和市场研究领域&#xff0c;Twitter&#xff08;现在的X&#xff09;数据一直是重要的信息来源。但是&#xff0c;自从Twitter更改API定价策略后&#xff0c;获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据&#xff1f; …...

第二部分:进阶主题 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];}} }; 双指针&#xff0c;一个指…...

【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)

117. 软件构建&#xff08;拓扑排序&#xff09; 继续边看解析边做题&#xff0c;思考时的问题做个如下的总结&#xff1a; 1. 存边用什么数据结构&#xff1f; 在题目中&#xff0c;我们需要存储节点之间的依赖关系&#xff08;边信息&#xff09;。选择适合的数据结构非常重…...

【NLP 16、实践 ③ 找出特定字符在字符串中的位置】

看着父亲苍老的白发和渐渐老态的面容 希望时间再慢一些 —— 24.12.19 一、定义模型 1.初始化模型 ① 初始化父类 super(TorchModel, self).__init__()&#xff1a; 调用父类 nn.Module 的初始化方法&#xff0c;确保模型能够正确初始化。 ② 创建嵌入层 self.embedding n…...

费解的开关(bfs + 哈希表 or 递推)

题目描述: 25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。 我们用数字“1”表示一盏开着的灯,用数字“0”表示关…...

C语言——实现求出最大值

问题描述&#xff1a;利用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)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

Flutter 中 Sliver 的各种装饰器介绍与使用

在 Flutter 中&#xff0c;Sliver 是一种可以在滚动视图中实现自定义效果的组件。Sliver 组件可以根据滚动位置动态改变其外观和行为。本文将介绍几种常用的 Sliver 装饰器及其使用方法。 1. SliverAppBar SliverAppBar 是一个可以随着滚动而变化的应用栏。它可以在用户向下滚…...

电感的基本概念

电感的定义&#xff1a; 电感一般是由导线绕成空芯线圈或带铁芯的线圈而制成。 当线圈中有电流通过时&#xff0c;线圈周围就会产生磁场&#xff0c;当线圈中流过的是直流电流时&#xff0c;线圆周围就会产生固定的磁场&#xff0c;线圈产生的物理现象就是电磁铁&#xff0c;当…...

linux基于systemd自启守护进程 systemctl自定义服务傻瓜式教程

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

HTTP协议和接口测试详解

介绍接口测试前我们先来介绍一下HTTP协议&#xff0c;为什么先要介绍HTTP协议呢因为因为我们做接口测试其实就是用测试工具&#xff08;postman,fiddler,jmeter等等&#xff09;或代码来模拟用户使用软件的场景&#xff0c;在我们模拟的时候不像平时功能测试时我们有已经开发完…...

vue3【实战】定义全局方法(两种方案)

以全局方法 calculate 为例 src/utils/calculate.ts export default {sum: function (a: number, b: number) {return a b} }方案1&#xff1a; 依赖注入 provide inject main.ts import calculate from ./utils/calculateapp.provide(calculate, calculate)页面中 // esl…...

基于JavaScript的DBUtils增删改查操作实验

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

初学stm32 --- 系统时钟配置

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

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...