一、Maven 基础篇:打好项目管理基石
1. Maven 简介
-
Maven 是什么:
*Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM(Project Object Model):项目对象模型
2. Maven 基础概念
1,仓库
仓库:用户存储资源,包含各种jar包。
在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
仓库分类:
本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源。
远程仓库:非本机电脑上的仓库,为本地仓库提供资源。
中央仓库:Maven团队维护,存储所有资源的仓库。
私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源。
私服的作用:
保存具有版权的资源,包含购买或自主研发的jar。
中央仓库中的jar都是开源的,不能存储具有版权的资源。
一定范围内共享资源,仅对内部开放,不对外共享。

2,坐标
什么是坐标:
坐标:Maven中的坐标用于描述仓库中资源的位置。
Maven坐标的主要组成:
groupID:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
artifactID:定义当前Maven项目名称(通常是模块名称,例如CRM,SMS)
version:定义当前项目版本号,形式为 0.0.1 - SNAPSHOT:
第一个0代表大版本号,第二个0代表分支版本号,第三个0表示小版本号SHAPSHOT -- 快照版本,ALPHA -- 内测版本,BETA -- 公测版本,RELE ASE -- 稳定版本,GA -- 正式发布
packaging:打包的方式,如:pom,jar,war,maven-plugin...
Maven坐标的作用:
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别和下载工作交由机器完成。
3. 生命周期与插件
项目构建生命周期
Maven对项目构建的生命周期划分为三套
1,clean:清理工作

2,default:核心工作,例如编译,测试,打包,部署等

如何要执行compile(编译)那么编译上面的都要先执行
如果要执行test(测试)那么测试上面的都要先执行
如果要执行install(安装)那么安装上面的都要先执行
3,site:产生报告,发布站点等

插件
插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
默认maven在各个生命周期上绑定有预设的功能
通过插件可以自定义其他功能
XML
<build>
<plugins>
<!-- 指定某个插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
4. 依赖管理
1,依赖传递
依赖具有传递性
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖传递冲突问题
1,路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
2,声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
3,特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
2,可选依赖(依赖阻断)
可选依赖指对外隐藏当前所依赖的资源------不透明
XML
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 用来指明是否不透明 -->
<optional>true</optional>
</dependency>
3,排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本------不需要
XML
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 用来指明排除哪个依赖 -->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
4,依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
作用范围(classpath)
1,主程序范围有效(main文件夹范围内)
2,测试程序范围有效(test文件夹范围内)
3,是否参与打包(package指令范围内)运行时

依赖范围传递性
带有依赖范围的资源在进行进行传递时,作用范围将受到影响

二、Maven 高级篇:进阶项目管理能力
1. Maven 聚合和继承
1,聚合
作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。
工程:
创建一个空模块,打包类型定义为pom
XML
<packaging>pom</packaging>
定义当前模块进行构建操作时关联的其他模块名称
XML
<!--管理的工程列表-->
<modules>
<!--具体的工程名称-->
<module>hami_core</module>
<module>hami_protal</module>
<module>hami_console</module>
</modules>
注意:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置的顺序无关。
2,继承
作用:通过继承可以实现在子工程中沿用父工程中的配置
maven中的继承与java中的继承相似,在子工程中配置继承关系
过程:
在子工程中声明其父工程坐标与对应的位置
XML
<parent>
<artifactId>hami_parent</artifactId>
<groupId>com.qcby</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../ssm/pom.xml</relativePath>
</parent>
在父工程中定义依赖管理
XML
<!--此处声明依赖管理-->
<dependencyManagement>
<!--具体依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本
XML
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
可以继承的元素(常用):


計注意:artifactId不可以继承,没有项目都要有自己的artifactId
3. 属性定义与使用
属性类别:自定义属性
作用:等同于定义变量,方便统一维护
定义:
XML
<!--定义自定义属性--> <properties> <junit.version>4.12</junit.version> </properties>
调用:
XML
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency>
属性类别:内置属性
作用:使用maven内置属性,快速配置
调用:
XML
${basedir} ${version}
属性类别 :Settings属性
作用:使用maven配置文件setting.xml中的标签属性,用于动态配置
调用:
XML
${settings.localRepository}
属性类别:环境变量属性
调用:
XML
${env.JAVA_HOME}
环境变量属性查询方式
XML
mvn help:system
4. 私服
Nexus
Nexus是Sonatype公司的一款maven私服产品。
仓库分类
- 宿主仓库(hosted):
- 保存无法从中央仓库获取的资源
- 自主研发
- 第三方开源项目
- 保存无法从中央仓库获取的资源
- 代理仓库(proxy):
- 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
- 仓库组group:
- 将若干仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
将项目发布到私服
- 配置访问服务器的权限,用户名密码
XML
// <servers>中的内容
<!-- 定义稳定版本的id,用户名,密码 -->
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<!-- 定义开发版本的id,用户名,密码 -->
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
XML
配置私服仓库的地址,根据工程的版本号决定上传的宿主仓库,
如果版本为release则上传到私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库
根据url判断仓库
id要和settings中配置的id相同。
// pom文件中内容
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8079/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8079/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
从私服下载资源
- 在settings.xml文件中配置镜像
XML
// settings文件内容
<mirror>
<!-- id名称 -->
<id>nexusmaven</id>
<!-- 表示拦截所有的请求,都重定向到私服,从私服下载jar包,私服没有去中央仓库下载 -->
<mirrorOf>*</mirrorOf>
<!-- 私服组地址 -->
<url>http://localhost:8079/nexus/content/groups/public/</url>
</mirror>
XML
<!-- 下载jar的配置 -->
<profile>
profile的id
<id>dev</id>
<repositories>
<repository>
仓库id,repositories可以配置多个仓库,保证id不重复
<id>nexus</id>
仓库地址,即nexus仓库组的地址
<url>http://localhost:8079/nexus/content/groups/public/</url>
是否下载releases构件
<releases>
<enabled>true</enabled>
</releases>
是否下载snapshots构件
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
插件仓库,maven的运行依赖插件,也需要从私服下载插件
<pluginRepository>
插件仓库的id不允许重复,如果重复后边配置会覆盖前边
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8079/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
XML
// 激活环境
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
第三方jar包发布到私服
- 把jar包安装到本地仓库
XML
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson
-Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
- 把jar包上传到私服
先在settings中配置server
XML
<!-- 定义第三方组件的id,用户名,密码 -->
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
XML
// 上传到私服
mvn deploy:deploy-file
-DgroupId=com.alibaba
-DartifactId=fastjson
-Dversion=1.1.37
-Dpackaging=jar
-Dfile=fastjson-1.1.37.jar
-Durl=http://localhost:8079/nexus/content/repositories/thirdparty/
-DrepositoryId=thirdparty
三、总结
至此,Maven的核心基础用法就全部讲解完毕了。从环境搭建到项目创建,从依赖管理到打包部署,Maven用"约定优于配置"的理念,帮我们解决了Java项目中依赖混乱、构建繁琐的问题,让开发流程更规范、效率更高。 对于新手来说,无需一开始就纠结复杂特性,先把"环境配置、POM文件、常用命令"这三大核心掌握,就能应对日常开发需求。多在实际项目中练习,遇到问题时优先检查配置文件和依赖情况,慢慢就能熟练驾驭。 希望这篇文章能帮你快速上手Maven,让它成为你开发路上的好帮手~ 如有疑问,欢迎在评论区交流!
