登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
VIP网盘
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
Maven 整理
Maven 整理
[ 复制链接 ]
荪俗
2025-6-9 09:14:41
Maven简介
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM:Project Object Model)
这玩意儿是使用Java开发的,所以采用的就是Java的思想:面向对象
Maven的作用:
项目构建:提供标准的、跨平台的自动化项目构建方式
依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
统一开发结构:提供标准的、统一的项目结构
下载与安装:
官网:http://maven.apache.org/
下载:http://maven.apache.org/download.cgi
Maven基础概念
仓库:用于存储资源,包含各种jar包
仓库分类:本地仓库和远程仓库(私服和中央仓库)
坐标:Maven中的坐标用于描述仓库中资源的位置
坐标的主要组成:
groupId:定义当前Maven项目隶属组织名称(通常是域名反写)
artifactId:定义当前Maven项目名称(通常是模块名称)
version:定义当前版本号
packaging:定义该项目的打包方式
坐标的作用:使用唯一的标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载交由机器完成。
仓库配置:
本地仓库配置:默认位置与自定义位置
远程仓库配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://maven.aliyun.com/repository/central</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
复制代码
镜像仓库配置:阿里云Maven镜像仓库配置地址
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
复制代码
全局setting和用户setting
定义当前计算机中Maven的公共配置,即 mavne安装目录/conf/setting.xml
定义当前用户配置,即 配置的本地仓库地址处有个平级的setting.xml
注:用户setting和全局setting不一致时,会优先采用用户setting.xml的配置,因此最好是这二者内容保持一致
Maven项目
手动生成Maven项目
Maven工程目录结构
Maven项目构建命令:Maven构建命令使用mvn开头,后面加功能参数,可以一次执行多个命令,使用空格分隔
mvn compile # 编译
mvn clean # 清理
mvn test # 测试
mvn package # 打包
mvn install # 安装到本地仓库
复制代码
IDEA生成Maven项目
使用原型创建Maven项目与不使用原型创建Maven项目
例:使用原型创建web项目,选择archetype-webapp进行项目创建,添加Tomcat插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
复制代码
依赖管理
依赖配置:依赖指的是当前项目运行所需要的jar,一个项目可以设置多个依赖。格式:
<dependencies>
<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<type></type>
<scope>import</scope>
</dependency>
</dependencies>
复制代码
依赖传递
依赖具有传递性,包括直接传递和间接传递
直接传递:在当前项目中通过依赖配置建立的依赖关系(A使用B,A和B就是直接传递)
间接传递:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源(比较拗口,意思是如果A依赖B,而B依赖C,那么A和C之间就是间接传递)
依赖传递的冲突问题:
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
可选依赖
可选依赖指的是对外隐藏当前所依赖的资源
<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<optional>true</optional>
</dependency>
复制代码
排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
依赖范围
依赖的jar包默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
作用范围:
主程序范围有效(main文件夹范围内)
测试程序范围有效(test文件夹范围内)
是否参与打包(package文件夹范围内)
还有两个:system、import
import:依赖项替换为指定 POM 的 中的该依赖项。仅 部分中 <packaging>pom</packaging> 类型的依赖项支持此范围
依赖范围传递性:带有依赖范围的资源在传递时,作用范围会受到影响
生命周期与插件
Maven项目构建生命周期描述的是一次构建过程经历了多少个事件
Maven对项目构建的生命周期划分为3套
clean:清理工作
default:核心工作,例如编译、测试、打包、部署等
site:产生报告,发布站点等
clean生命周期:
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
default构建生命周期:compile ——> test-compile ——> test ——> package ——> install
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程
initialize(初始化) 初始化构建状态,比如设置属性值
generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码
process-sources(处理源代码) 处理源代码,比如说,过滤任意值
generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件
process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备
compile(编译) 编译项目的源代码
process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化
generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码
process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值
generate-test-resources(生成测试资源文件) 为测试创建资源文件
process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录
test-compile(编译测试源码) 编译测试源代码到测试目标目录
process-test-classes(处理测试类文件) 处理测试源码编译生成的文件
test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)
prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件
pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境
integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中
post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖
deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享
site生命周期:
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
插件:插件与生命周期内的阶段绑定,在执行到对应的生命周期时执行对应的插件功能
org.apache.maven.plugins maven-source-plugin 2.2.1<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency><dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency><dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency> jar<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency> generate-test-resources<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
jar值选项:官网:Apache Maven Source Plugin
source:aggregate aggregrates sources for all modules in an aggregator project.
source:jar is used to bundle the main sources of the project into a jar archive——对main中源代码打包
source:test-jar on the other hand, is used to bundle the test sources of the project into a jar archive——对测试代码打包
source:jar-no-fork is similar to
jar
but does not fork the build lifecycle.
source:test-jar-no-fork is similar to
test-jar
but does not fork the build lifecycle.
聚合
作用:聚合用于快速构建Maven工程,一次性构建多个项目/模块
制作方式:创建一个空模块,打包类型定义为<packaging>pom</packaging>
<packaging>pom</packaging>
复制代码
定义当前模块进行构建操作时关联的其他模块名称
<modules>
<module>模块地址</module>
<module>模块地址</module>
<module>模块地址</module>
<module>模块地址</module>
</modules>
复制代码
注意:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关
继承
作用:通过继承可以实现在子工程中沿用父工程中的配置(与Java类似)
制作方式:在子工程中生命其父工程坐标与对应的位置
父工程<packaging>pom</packaging>文件地址
复制代码
在父工程中定义依赖管理
<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency><dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
继承依赖使用:在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本
<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency><dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency>
复制代码
继承的资源:
继承与聚合的区别
作用:聚合用于快速构建项目,继承用于快速配置
相同点:
聚合与继承的<packaging>pom</packaging>.xml文件打包方式均为<packaging>pom</packaging>,可以将两种关系制作到同一个<packaging>pom</packaging>文件中
聚合与继承均属于设计型模块,并无实际的模块内容
不同点:
聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
属性
自定义属性
作用:等同于定义变量,方便统一维护
定义格式:
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
复制代码
调用格式:
<dependency>
<groupId>org.springframework</groupId>
spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
复制代码
内置属性
作用:使用Maven内置属性,快速配置
调用格式:
${basedir}
${version}
复制代码
Setting属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:
${settings.localRepository}
复制代码
Java系统属性
作用:读取Java系统属性
调用格式:
${user.home}
复制代码
系统属性查询方式:
mvn help:system
复制代码
环境变量属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式:
${env.JAVA_HOME}
复制代码
环境变量属性查询方式:
mvn help:system
复制代码
版本管理
SNAPSHOT(快照版本):
项目开发过程中,方便团队成员合作,解决模块间相互依赖和实时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本就叫快照版本(测试阶段版本)
快照版本会随着开发的进展不断更新
RELEASE(发布版本):
项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本的内容,这种版本就叫发布版本
工程版本号约定:
资源配置
配置文件引用<packaging>pom</packaging>属性
作用:在任意配置文件中加载<packaging>pom</packaging>文件中定义的属性
<packaging>pom</packaging>中定义变量:
<properties>
<jdbc.username>root</jdbc.username>
<jdbc.password>zixieqing072413</jdbc.password>
</properties>
复制代码
<packaging>pom</packaging>中开启配置文件加载<packaging>pom</packaging>属性
<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency> 地址 <dependency>
<groupId></groupId>
</artifactId>
<version></version>
<optional>true</optional>
</dependency><dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency> 地址 <dependency>
<groupId></groupId>
</artifactId>
<version></version>
<optional>true</optional>
</dependency>
复制代码
在需要使用变量得到配置文件中使用,调用格式:
${地址}
${jdbc.username}
复制代码
多环境开发配置
开发环境名称1 jdbc链接 <dependency>
<groupId></groupId>
</artifactId>
<version></version>
<optional>true</optional>
</dependency>
复制代码
Maven使用命令启动那套环境:
mvn 指令 -p 环境定义id
# 示例
mvn install -p prod_env
复制代码
跳过测试
提示
正式开发时,不建议跳过
跳过测试的场景:
整体模块功能未开发
模块中某个功能未开发完毕
单个功能更新调试导致其他功能失败
快速打包
.........................
使用方式:
命令的方式
mvn 指令 –D skipTests
# 示例
mvn install –D skipTests
复制代码
注意
执行的指令生命周期必须包含测试环节
使用IDEA界面操作
使用<packaging>pom</packaging>配置
maven-surefire-plugin 2.22.1 <dependency>
<groupId></groupId>
</artifactId>
<version></version>
<optional>true</optional>
</dependency> **/User*Test.java<dependency>
<groupId></groupId>
</artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
</artifactId>
</exclusion>
</exclusions>
</dependency> **/User*TestCase.java
复制代码
私服
使用Nexus,是sonatype的产品:
下载地址1:https://help.sonatype.com/re<packaging>pom</packaging>anager3/download
下载地址2:https://www.sonatype.com/thanks/repo-oss
启动服务器(Windows):
nexus.exe /run nexus
复制代码
访问服务器:默认端口8081,可在其配置文件中修改
http://localhost:8081
复制代码
修改基础配置信息:安装路径/etc/nexus-default.properties,如默认端口号
修改服务器运行配置:安装路径/bin/nexus.vmoptions,如默认内存空间大小
IDEA中资源上传和下载
私服仓库分类:
宿主仓库(hosted):保存无法从中央仓库获取的资源,如
自主研发
第三方非开源项目
代理仓库(proxy):代理远程仓库,通过Nexus访问其他公共仓库
仓库组(group):
将若干仓库组成一个群组,简化配置
仓库组不保存资源,属于设计型仓库
私服用户名密码:配置在本地仓库的setting.xml中即可
上传位置:配置在IDEA中,上传到私服中的仓库组不同
下载地址:配置在本地仓库的setting.xml即可
访问私服配置
配置本地仓库访问私服权限(setting.xml)
<servers>
<server>
<id>zixq-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>zixq-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
复制代码
配置本地仓库来源(setting.xml)
<mirrors>
<mirror>
<id>nexus-zixq</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
复制代码
IDEA发布依赖到私服配置
配置当前项目访问私服上传资源的保存位置(<packaging>pom</packaging>.xml)
<distributionManagement>
<repository>
<id>zixq-release</id>
<url>http://localhost:8081/repository/zixq-release/</url>
</repository>
<snapshotRepository>
<id>zixq-snapshots</id>
<url>http://localhost:8081/repository/zixq-snapshots/</url>
</snapshotRepository>
</distributionManagement>
复制代码
发布资源到私服的命令
mvn deploy
复制代码
流程:通过IDEA <packaging>pom</packaging>中配置的http://localhost:8081/repository/zixq-release/访问私服,通过zixq-release去本地仓库的setting.xml 的server id找访问私服的username、password,然后进行发布
IDEA插件之Maven Helper
Maven Helper可以解决依赖问题,安装了Maven Helper插件,只要打开<packaging>pom</packaging>文件,就可以打开该<packaging>pom</packaging>文件的Dependency Analyzer视图,并且这个页面还支持搜索。很方便
进入Dependency Analyzer视图之后有三个查看选项,分别是:
Conflicts:冲突
All Dependencies as List:列表形式查看所有依赖
All Dependencies as Tree:树结构查看所有依赖
jar包冲突说明
解决IDEA中jar包冲突,使用maven的插件:maven helper插件,它能够给我们罗列出来同一个jar包的不同版本,以及它们的来源,但是对不同jar包中同名的类没有办法
依赖顺序
点击【All Dependencies as Tree】,查看:从上向下,A依赖于B,B依赖于C
.点击【Conflicts】,从图中可以看出有哪些jar存在冲突,存在冲突的情况下最终采用了哪个依赖的版本。
标红的就是冲突版本,白色的是当前的解析版本。这个选项,需要从下向上看
解决思路
排除指定的版本
:如果有两个依赖的版本发生了冲突,那么只要用exclusion关键字把其中一个依赖给排除掉,只剩下一个依赖即可
子工程指定版本号
子工程先排除,再指定版本号
:如下图,在starter-web中排除spring-webmvc,然后指定spring-webmvc的版本为6.0.9
锁定版本
:使用dependencyManagement统一对依赖的版本进行定义
路径优先
:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。实际使用就是直接在<packaging>pom</packaging>中显示使用且定义版本
声明优先
:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
特殊优先
:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
对应MD文档
链接:Maven 笔记
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
Maven
整理
相关帖子
Maven配置Nexus3使用
Maven 30问
java使用maven-shade-plugin打包
我整理了 10 条 AI 聊天应用的需求
解决 Maven os.detected.classifier 报错:快速修复指南
AWTK项目编译问题整理(1)
读整理优先:小改进,大回报,整洁代码设计指南(上)
MAVEN构建分离依赖JAR
Maven 构建知识库
经验贴:利用Maven打包时的注意事项
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
Maven配置Nexus3使用
0
980
铝缉惹
2025-06-09
业界
Maven 30问
0
319
扒钒
2025-06-09
业界
java使用maven-shade-plugin打包
0
999
黎瑞芝
2025-06-10
科技
我整理了 10 条 AI 聊天应用的需求
0
1120
挽幽
2025-06-12
科技
解决 Maven os.detected.classifier 报错:快速修复指南
0
468
恿深疏
2025-06-17
业界
AWTK项目编译问题整理(1)
0
639
红弘丽
2025-07-07
安全
读整理优先:小改进,大回报,整洁代码设计指南(上)
0
82
蔓好
2025-07-12
业界
MAVEN构建分离依赖JAR
0
599
森萌黠
2025-08-08
安全
Maven 构建知识库
0
1056
訾颀秀
2025-08-08
安全
经验贴:利用Maven打包时的注意事项
0
522
浦乐
2025-09-01
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
代码
签约作者
程序园优秀签约作者
发帖
荪俗
2025-6-9 09:14:41
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
黎瑞芝
9990
杭环
9988
4
凶契帽
9988
5
氛疵
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多