Maven

Maven

Maven是跨平台的项目管理工具,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。

Maven的作用:

  • 项目构建:提供标准的、跨平台的自动化项目构建方式
  • 依赖管理: 方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准的、统一的项目结构

基本概念

项目对象模型(POM)

POM(Project Object Model)是Maven项目的核心文件,文件名为pom.xml。开发人员在这个文件中定义项目的基本信息、依赖关系以及相关的构建任务和插件。Maven会根据pom.xml文件的定义来执行相应的构建任务。POM文件包含以下主要元素:

  1. GAVP属性:包括groupId(项目组ID)、artifactId(项目工件ID)、version(项目版本号)和packaging(打包类型)。
  2. 依赖关系(dependencies):用于声明项目所需的库和框架依赖,每个依赖都包含组ID、工件ID和版本号等信息。
  3. 构建元素(build):包含项目的构建信息和构建过程中的各种任务。
  4. 插件元素(plugins):允许使用Maven的插件系统增强构建过程,每个插件包含插件组ID、插件工件ID、版本号和配置信息等。
  5. 环境配置元素(profiles):根据不同的环境为项目进行不同的构建设置。
  6. 属性元素(properties):定义了一组全局属性,可在POM中引用,以提高POM文件的可维护性和可读性。

依赖管理

依赖管理是Maven的一个核心特性,它提供一种规范的方式来定义依赖项,自动地下载这些依赖项,并解决依赖项之间的冲突。通过依赖管理,可以避免手动下载和安装依赖项所带来的问题,并简化项目构建和开发的流程。

在pom.xml文件中,可以使用依赖元素来声明项目所需的依赖项。依赖项通常包含groupId、artifactId和version元素,用于唯一标识一个库或框架的版本。此外,还可以使用依赖范围来指定依赖项的使用范围,如compile、test、provided等,以决定Maven在构建过程中如何处理依赖项。

构建生命周期

Maven生命周期定义了一系列构建过程的标准步骤,它规定了Maven在项目构建过程中执行的操作和顺序。Maven分为三个生命周期:clean生命周期、default生命周期和site生命周期。

  1. clean生命周期:用于清理项目目录,包括清理项目输出目录、清理测试输出目录、清理项目临时文件等操作。
  2. default生命周期:是构建项目的核心生命周期,包括了编译、测试、打包等操作。默认情况下,Maven执行到package阶段时会将源代码编译、测试、打包,并将包发布到本地Maven仓库中。
  3. site生命周期:用于生成项目文档和站点,包括生成HTML文档、生成静态站点等操作。

插件管理

Maven插件管理是Maven的又一重要特性,它以插件为中心对Maven构建生命周期进行扩展,提供一些常用或特定的构建功能。Maven插件分为内置插件和外部插件。内置插件用于支持Maven构建的基本功能,如maven-compiler-plugin用于Java代码的编译,maven-jar-plugin用于将项目打包为JAR文件等。外部插件可以从Maven中央仓库或其他仓库获取并使用。

多模块项目支持

Maven支持创建多模块项目,简化大型项目的组织和管理。多模块项目可以共享依赖、插件和属性配置,方便项目配置和维护。通过多模块项目支持,可以更好地组织和管理复杂的Java项目。

综上所述,Maven的基本概念包括POM、依赖管理、构建生命周期、插件管理和多模块项目支持等。这些概念共同构成了Maven的核心功能,为Java项目的构建和管理提供了方便和高效。

分模块开发与设计

意义:将原始的模块按照功能拆分成若干个模块,方便模块间的相互调用,接口共享。

  1. 例如,传统的三层架构+domain 的包结构,现在要将domain作为公共的模块,拆分出去

  2. 创建新的模块,与原来模块同级,并保持包结构一致。

  3. 然后在里面写出domain代码

  4. 通过maven指令安装模块到本地仓库(install)

  5. 将domain模块导入到server模块中

注意:团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)

依赖

依赖管理

依赖指当前项目运行所需的jar,一个项目可以设置多个依赖

格式:

xml 复制代码
<!-设置当前项目所依赖的所有jar-->
<dependencies>
	<!-设置具体的依赖-->
	<dependency>
		<!-依赖所属的群组id-->
		<groupId></groupId>
		<!-依赖所属的项目id-->
		<artifactId></artifactId>
		<!-依赖版本号-->
		<version></version>
	</dependency>
</dependencies>

依赖传递

依赖具有传递性

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系(POM文件中写的)
  • 间接依赖:被依赖资源如果依赖其他资源,当前项目间接依赖其他资源

依赖传递冲突

依赖传递冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  • 特殊优待:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

可选依赖与排除依赖

如果我们引用的部分资源,不想让他传递给调用者,那么我们可以使用可选依赖

dependency标签中写的<optional>true</optional>

xml 复制代码
<dependencies>
	<dependency>
		<groupId></groupId>
		<artifactId></artifactId>
		<optional>true</optional>
	</dependency>
</dependencies>

可选依赖是隐藏当前工程所依赖的资源。

隐藏后对应资源将不再具有传递性

如果子模块中有依赖,在父模块中不想引用,除了以上方法还可以使用另一种

排除依赖

xml 复制代码
<dependencies>
	<dependency>
		<groupId></groupId>
		<artifactId></artifactId>
		<!-排除依赖是隐藏当前资源对应的依赖关系-->
		<exclusions>
			<exclusion>
				<groupId></groupId>
				<artifactId></artifactId>
				<!-注意:排除不需要指定版本-->
			</exclusion>

			<exclusion>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>

排除依赖资源仅指定GA即可,无需指定V

总的来说,可选依赖侧重于功能使用的选择性,而排除依赖侧重于对已有依赖关系中不良依赖的排除处理。

继承与聚合

聚合

将多个模块组织为一个整体,同时进行项目构建的过程中称为聚合

聚合工程:

  • 通常是一个不具有业务功能的"空"工程(有且仅有一个POM文件)

作用:

  • 使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建。

方法:

  • 建立一个模块,将dependencies标签删除。
  • 这个工程与其他工程的区别是它的打包方式不同
xml 复制代码
<!-设置管理的模块名称-->
<modules>
	<module></module>
	<module></module>
	<module></module>
</modules>

<!-添加该标签,表示该模块打包为pom-->
<packaging>pom</packaging>

注意:每个maven工程都有对应的打包方式,默认为jar,web工程打包方式为war

注意:聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。

参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合

相当于先建立一个大工程,在这个工程内建立多个小工程,这样在构建

继承

两个工程间的关系,与Java类似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。

作用:

  • 简化配置
  • 减少版本冲突
xml 复制代码
<!-与Java相同,继承关系在子类(子模块)中声明-->
<!-配置当前工程继承自parent工程-->
<parent>
    <groupId></groupId>
    <artifactId></artifactId>
    <version></version>
    <!-parent工程路径-->
    <relativePath>../XXX/pom.xml</relativePath>
</parent>

在配置好之后,可以将公共的依赖资源提取到父工程(root)中

依赖管理

在父工程中可以定义依赖管理

xml 复制代码
<!-定义依赖管理-->
<dependencyManagement>
	<dependency>
		<groupId></groupId>
		<artifactId></artifactId>
		<version></version>
	</dependency>
</dependencyManagement>

在该部分的依赖对于子工程而言是可选依赖,若想要使用,必须声明

xml 复制代码
<dependency>
	<groupId></groupId>
	<artifactId></artifactId>
    <!-子工程不再需要写版本,版本由父工程统一提供-->
</dependency>

子工程中还可以定义父工程中没有定义的依赖关系

聚合和继承的区别

  • 作用:

    • 聚合用于快速构建项目

    • 继承用于快速配置

  • 相同点:

    • 聚合和继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
    • 聚合与继承均属于设计型模块,并无实际的模块内容
  • 不同点:

    • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

属性

统一版本管理

相当于将版本设置为一个变量,然后再version标签处引用变量

xml 复制代码
<!--定义属性-->
<properties>
	<spring-version>5.2.10.RELEASE</spring-version>
	<junit.version>4.12</junit.version>
</properties>
xml 复制代码
<!--使用属性-->
<groupId></groupId>
<artifactId></artifactId>
<version>${spring.version}</version>

建议以后所有的依赖版本全部写到属性

版本号

工程版本

  • SNAPSHOT(快照版本)
    • 项目开发过程中,临时输出的版本称为快照版本
    • 快照版本会随着开发的进展不断更新
  • RELEASE (发布版本)
    • 项目开发到进行阶段里程碑后向团队外部发布较为稳定的版本。这种版本所对应的构建文件是稳定的,即使进行功能的后续开发也不会改变。当前发布版本内容,这种版本称为发布版本。

发布版本

  • alpha版
  • beta版
  • 纯数字版

多环境配置

maven提供配置多种环境的设定,帮助开发者使用过程中快速切换环境

xml 复制代码
<!--配置多环境-->
<profiles>
	<!--开发环境-->
	<profile>
		<id>env_dep</id>
		<roperties>
			<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
		</roperties>
		<!--设定是否为默认启动环境-->
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<!--生产环境-->
	<profile>
		<id>env_pro</id>
		<roperties>
			<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
		</roperties>
	</profile>
	<!--测试环境-->
	<profile>
		<id>env_test</id>
		<roperties>
			<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
		</roperties>
	</profile>
</profiles>

在构建时,也可以使用命令选择环境,mvn 指令 -P 环境定义id

powershell 复制代码
mvn install -P pro_env

跳过测试

应用场景

  • 功能更新中并没有开发完毕
  • 快速打包

方式一:
IDEAMaven,栏中点击闪电按钮

或者在构建命令中输入:mvn 指令 -D skipTests

powershell 复制代码
mvn install -D skipTests

方式二:

xml 复制代码
<build>
	<plugins>
		<!--测试插件-->
		<plugin>
			<artifactId>maven-surefire-plugin</artifactId>
			<version>2.12.4</version>
			<configuration>
				<skipTests>true</skipTests>
				<!--选择参与测试内容,上面必须要设为true-->
				<includes>
					<include>**/BookServiceTest.java</include>
				</includes>
				<!--选择不参与测试内容,上面必须要设为false-->
				<excludes>
					<exclude>**/BookServiceTest.java</exclude>
				</excludes>
			</configuration>
		</plugin>
	</plugins>
</build>

私服

是一台独立的服务器,用于解决团队内部的资源与资源共享与资源同步问题

Nexus

Nexus:Sonatype公司的一款maven私服产品

下载地址:https://help.sonatype.com/en/download.html

启动服务器:

nexus-3.70.3-01\bin 目录下

powershell 复制代码
nexus.exe /run nexus

访问服务器(默认端口8081)localhost:8081

修改基础配置信息

  • 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口

修改服务器运行配置信息

  • 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间

私服仓库分类

  1. 宿主仓库(hosted)的作用和功能
    • 作用
      • 资源整合:是企业内部软件资产的存储中心,整合自主研发成果和许可的第三方资源,方便集中管理,避免资源分散在各个开发人员的设备中。
      • 内部共享:促进团队内部的协作,不同项目组的开发人员可以方便地获取已经开发完成的组件、工具等,提高代码复用率。
    • 功能
      • 资源存储与管理:提供安全可靠的存储空间,允许开发人员上传、更新和删除软件资源。可以设置访问权限,确保只有授权人员能够对资源进行操作。
      • 版本管理:记录每个资源的版本演变过程,支持开发人员查看历史版本、回滚到旧版本等操作。这对于软件维护和问题排查非常重要。
  2. 代理仓库(proxy)的作用和功能
    • 作用
      • 加速下载:作为本地缓存和中央仓库之间的桥梁,有效减少从外部中央仓库下载资源的时间,提高开发效率。
      • 网络优化:降低企业内部网络对外部仓库的频繁访问,节省网络带宽,同时减少因外部网络波动或中央仓库故障对内部开发的影响。
    • 功能
      • 缓存管理:自动缓存从中央仓库下载的资源,并且可以根据一定的策略(如缓存大小、缓存有效期等)来管理缓存。
      • 代理请求:接收内部开发人员的下载请求,判断资源是否已缓存,若已缓存则直接返回,否则从中央仓库获取并缓存后再返回。
  3. 仓库组(group)的作用和功能
    • 作用
      • 简化操作:对于开发人员来说,不用分别记住多个仓库的地址和访问方式。通过仓库组,可以将多个相关仓库组合在一起,开发人员只需从仓库组进行下载操作,仓库组会自动在内部的多个仓库中查找资源。
      • 统一管理:从管理角度,方便对一组相关仓库进行权限设置、资源分配等操作。例如,可以将测试资源仓库和开发资源仓库组合成一个仓库组,统一控制访问权限。
    • 功能
      • 资源搜索与定位:当开发人员请求一个资源时,仓库组会按照预先定义的顺序在包含的各个仓库中查找资源,直到找到匹配的资源为止。
      • 仓库整合:将不同类型(如宿主仓库和代理仓库)或不同用途的仓库整合为一个逻辑单元,在下载等操作中可以协同工作。

总结:

仓库类别 英文名称 功能 关联操作
宿主仓库 hosted 保存自主研发+第三方资源 上传
代理仓库 proxy 代理连接中央仓库 下载
仓库组 group 为仓库编组简化下载操作 下载

资源上传与下载

IDEA首先将jar包放到本地仓库,然后再上传到私服

下载也是从私服下载到本地仓库

访问私服的用户名/密码

下载的地址(仓库组地址)

所以应该在本地仓库中设置,在maven安装目录中-conf-settings.xml

xml 复制代码
<!--配置私服权限-->
<server>
  <id>私服中的服务器id名称</id>
  <username>用户名/username>
  <password>密码</password>
</server>
xml 复制代码
<!--配置私服访问路径-->
<mirror>
	<!--仓库组id-->
    <id>mirrorId</id>
    <mirrorOf>*</mirrorOf>
    <url>http://my.repository.com/repo/path</url>
</mirror>

在pom中配置当前项目要发布到哪个仓库中

xml 复制代码
<!--配置当前工程保存在私服中的具体位置-->
<distributionManagement>
	<repository>
		<id>name-release</id>
		<url>http://localhost:8081/repository/name-release/</url>
	</repository>
	<snapshotRepository>
		<id>name-snapshot</id>
		<url>http://localhost:8081/repository/name-snapshot/</url>
	</snapshotRepository>
</distributionManagement>

发布命令:mvn deploy

相关推荐
F-2H1 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05671 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
_oP_i2 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx2 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康2 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘3 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意4 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
FF在路上4 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
真的很上进4 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
众拾达人5 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言