[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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490766.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多分类交叉熵与稀疏分类交叉熵

总结: 标签为 One-hot 编码的多分类问题,用分类交叉熵对于标签为整数的多分类问题,用稀疏分类交叉熵稀疏分类交叉熵内部会将整数标签转换为 One-hot 编码,而如果标签已经是 One-hot 编码的形式,再使用稀疏分类交叉熵就会多此一举。 算例 假设我们有三个类别:A、B 和 C。…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com

问题 今天jenkins打包一个项目&#xff0c;发现报错了 error An unexpected error occurred: “https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com”. 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmirror.…

前端(模块化)

未使用模块化 定义两个js文件simple1.js和simple2.js let a11; let a11; 两个js文件变量重名 在html测试 传统引入js文件 <script src"./simple1.js"></script> <script src"./simple2.js"></script> 浏览器报错 使用模块…

JAVA入门:文件管理

JAVA入门:文件管理 在学习java之前,首先学习一下java的文件管理,以便后续更好地学习。 创建一个空项目 点击右上角File->New->Module 创建新模块 配置工程环境 点击File->Project Structure 选择project&#

QT:Widgets中的事件

事件的处理 (1)重新实现部件的paintEvent()、mousePressEvent()等事件处理函数。这是最常用的一种方法&#xff0c;不过它只能用来处理特定部件的特定事件。 (2)重新实现notify()函数。这个函数功能强大&#xff0c;提供了完全的控制&#xff0c;可以在事件过滤器得到事件之前…

jvm结构介绍

Java虚拟机&#xff08;JVM&#xff09;是Java平台的核心组件&#xff0c;它负责将Java字节码转换为机器码 1. 类加载子系统&#xff08;Class Loading Subsystem&#xff09;&#xff1a; • 负责将Java类加载到JVM中。这包括从文件系统、网络或其他来源读取.class文件&#x…

uni-app多环境配置动态修改

前言 这篇文章主要介绍uniapp在Hbuilderx 中&#xff0c;通过工程化&#xff0c;区分不同环境、动态修改小程序appid以及自定义条件编译&#xff0c;解决代码发布和运行时手动切换问题。 背景 当我们使用uniapp开发同一个项目发布不同的环境二级路径不同时&#xff0c;这时候…

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…

解决“VMware虚拟机报Intel VT-x”错误

今天&#xff0c;在windows系统上&#xff0c;打开VMware WorkStation v15软件里的虚拟机&#xff0c;弹出"Intel VT-x处于禁用状态"错误&#xff0c;如图(1)所示&#xff1a; 图(1) 虚拟机报"Intel VT-x"错误 问题原因&#xff1a;当前电脑的BIOS没有开启…

【Linux-ubuntu通过USB传输程序点亮LED灯】

Linux-ubuntu通过USB传输程序点亮LED灯 一,初始化GPIO配置1.使能时钟2.其他寄存器配置 二&#xff0c;程序编译三&#xff0c;USB传输程序 一,初始化GPIO配置 1.使能时钟 使能就是一个控制信号&#xff0c;用于决定时钟信号是否能够有效的传递或者被使用&#xff0c;就像一个…

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办&#xff0c;开启美食文化交流新篇章 近日&#xff0c;首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办&#xff0c;这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…

vue运行项目时local有显示 但是network却显示unavailable

问题描述 日常开发中 和后端本地调试时 后端需要使用你的本地去访问页面 可运行项目时会出现network显示unavailable的情况 解决方式 1.其实这只是vue脚手架对于ip地址获取的方式兼容上有一些问题 但其实是不影响ip访问本地的 你可以直接cmd内ipconfig去查看自己的ip然后…

Edge SCDN的独特优势有哪些?

强大的边缘计算能力 Edge SCDN&#xff08;边缘安全加速&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为用户提供稳定快速的访问…

【SpringAOP】深入浅出SpringAOP从原理到源码

AOP对象是如何创建的 对于熟悉Spring IOC流程源码的同学来说&#xff0c;一定了解bean的整个生命周期&#xff0c;也就是从实例化、属性填充、初始化三个过程。那么对于Bean 工厂来说&#xff0c;是如何保证需要创建代理的对象创建代理的呢。 从图中可以看到&#xff0c;本质…

【Go】Linux、Windows、Mac 搭建Go开发环境

1、Linux 第一步&#xff0c;在 官网 下包&#xff0c;如 go1.23.4.linux-386.tar.gz&#xff08;注意架构区分&#xff09; 第二步&#xff0c;将包上传至服务器&#xff0c;假如上传到 tmp目录下第三步&#xff0c;安装# 解压 tar -C /app -xzvf go1.23.4.linux-386.tar.gz#…

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力&#xff0c;其毕业生就业前景及薪资水平均颇为可观。因此&#xff0c;学生应依据个人课程专长来选定专业。若各项课程均表现出色&#xff0c;推荐25届考生优先考虑软件专业&#xff0c;因其上岸难度相对较低。 接下来&#xff0c;C…

Unity3D实现抽象类的应用场景例子

系列文章目录 unity知识点 文章目录 系列文章目录👉前言👉一、示例👉二、使用步骤👉三、抽象类和接口的区别👉3-1、抽象类👉3-2、接口类👉壁纸分享👉总结👉前言 假设我们正在制作一个游戏,游戏中有多种不同类型的角色,这些角色都有一些共同的行为(比如移…

(五)机器学习 - 数据分布

数据分布&#xff08;Data Distribution&#xff09;是指数据在不同值或值区间内的分布情况&#xff0c;它描述了数据点在整个数据集中是如何分散或集中的。数据分布可以通过多种方式来分析和表示&#xff0c;包括图形和数值方法。 常见的数据分布特征和描述数据分布的方法&…

【恶意软件检测论文】用于 Android 恶意软件检测的混合 ML-DL 方法

目录 摘要1. 引言2. 文献综述传统检测方法机器学习方法混合方法最新进展移动恶意软件检测的挑战 3. 问题陈述4. 研究目标5. 提出的方法论1. 数据集获取2. 数据预处理3. 特征工程和选择4. 模型实现5. 模型评估6. 比较和分析 6. 结论 用于 Android 恶意软件检测的混合 ML-DL 方法…

Linux网络 UDP socket

背景知识 我们知道&#xff0c; IP 地址用来标识互联网中唯一的一台主机&#xff0c; port 用来标识该主机上唯一的一个网络进程&#xff0c;IPPort 就能表示互联网中唯一的一个进程。所以通信的时候&#xff0c;本质是两个互联网进程代表人来进行通信&#xff0c;{srcIp&…