当前位置: 首页 > 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;为…...

实现星星评分系统

使用HTML、CSS和JavaScript实现星星评分系统 本文将详细讲解如何使用 HTML、CSS 和 JavaScript 实现一个简单的星星评分系统。用户可以通过点击星星进行评分&#xff0c;并且还能够看到星星的悬浮效果和已选中状态。 1. HTML 结构 我们首先在 HTML 中定义了一个星星评分的结…...

数据库建模工具 PDManer

数据库建模工具 PDManer 1.PDManer简介2.PDManer使用 1.PDManer简介 PDManer&#xff08;元数建模&#xff09;是一款功能强大且易于使用的开源数据库建模工具。它不仅支持多种常见数据库&#xff0c;如MySQL、PostgreSQL、Oracle、SQL Server等&#xff0c;还特别支持国产数据…...

后台运维操作建议

文章目录 1.版本升级2.配置发布3.数据库/脚本操作4.发布依赖确认5.发布规范6.服务下线参考文献 1.版本升级 版本升级是软件维护和演进中的关键环节&#xff0c;但它可能带来一系列问题。这些问题涉及兼容性、功能、性能、安全性等方面。 【强制】版本管理&#xff1a;使用版本…...

NX二次开发调用内部函数设置对象穿透显示DSS_ATTR_set_show_through

获取动态库libdisp.dll的路径 void TcharToChar(const TCHAR* tchar, char* _char) {int iLength; #if UNICODE//获取字节长度 iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);//将tchar值赋给_char WideCharToMultiByte(CP_ACP, 0, tchar, …...

ubuntu16.04ros-用海龟机器人仿真循线系统

下载安装sudo apt-get install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi sudo apt-get install ros-kinetic-rocon-*echo "source /opt/ros/kinetic/setup.bash…...

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误 您在 Ubuntu 20.04 上编译 OpenCV 3.2 时遇到的错误与 C 标准库的头文件配置问题有关。错误消息指出系统无法找到 <stdlib.h>&#xff0c;这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…...

HTML综合案例

为了前端考试。 效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

TanStack——为现代前端开发提供高性能和灵活的工具

TanStack 是一个由社区主导的开源项目集合&#xff0c;专注于为现代前端开发提供高性能和灵活的工具。它包括多个流行的 JavaScript 和 TypeScript 库&#xff0c;主要用于处理表格、查询、虚拟化、状态管理等功能。 文章目录 1、TanStack Query&#xff1a;1.1 useQuery&#…...

Java爬虫️ 使用Jsoup库进行API请求有什么优势?

在Java的世界里&#xff0c;Jsoup库以其强大的HTML解析能力而闻名。它不仅仅是一个简单的解析器&#xff0c;更是一个功能齐全的工具箱&#xff0c;为开发者提供了从网页抓取到数据处理的一站式解决方案。本文将深入探讨使用Jsoup库进行API请求的优势&#xff0c;并提供代码示例…...

React源码02 - 基础知识 React API 一览

1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串&#xff0c;而组件使用大写开头时&#xff0c;这…...