Meavn入门
POM:(project boject model)项目对象模型
Maven 资源包管理器
- 方便的依赖管理
- 统一的项目结构
- 跨平台标准的项目构建方式
运行原理:
sequenceDiagram participant a as pom.xml participant b as POM participant c as 依赖管理模型 participant d as 本地仓库 participant e as 远程仓库(私服) participant f as 远程仓库(MAVEN官方中央仓库) a->>b : 传入依赖的名字、版本 b->>c : 请求 c->>b : 管理依赖 c->>d : 请求 d->>e : 如果前者没有,则请求 e->>d : 返回给本地仓库下载 d->>f : 如果前者没有,则请求 f->>d : 返回给本地仓库下载
依赖管理
pom.XML中
1 |
|
在Maven Repository中搜索meavn的坐标信息
组织名
执行打包操作会把整个项目打包根据组织名写入meavn仓库
版本号中
-SNAPSHOT
是指快照版本 不稳定尚在开发-RELEASE
是发行版本,功能稳定- 如果不指定 例如
<version>1.1</version>
默认发行版,相当于<version>1.1-RELEASE</version>
在仓库中meavn根据一定格式的目录格式来定义jar包的路径,提供下载和查找、打包
格式:
groupId+"\"+artifactId+"\"+version+"\"+artifactId+"\"+version+.jar
,其中groupId的.
换为\
项目依赖
直接依赖
项目直接引入依赖
间接依赖。
通过依赖的项目中依赖的jar包进行依赖
graph LR 项目A--直接依赖-->A.jar 项目A--间接依赖-->项目B 项目B-->B.jar 项目B-->项目C 项目C-->C.jar
如图上所示,项目A可以同时拥有A.jar、B.jar、C.jar
引入项目依赖示例
在项目A引入依赖B
1 | <dependency> |
排除依赖
如果我想引入项目B的依赖,但是我又不想要项目B的某个依赖,该怎么办呢
在A项目的pom.xml中
1 | <dependency> |
项目B的pom.xml中
1 | <dependencies> |
此时A没有依赖c,B有依赖c,依赖c被项目A排除了
选择依赖
在项目B中选择依赖不让依赖传递 到 A ,B依旧可以使用依赖,但是依赖不会传递到A
在项目B中的pom.xml中
1 | <dependency> |
项目 A 并不会自动依赖于 library-c,除非在项目 A 的 POM 文件中显式声明。
依赖范围
在引入依赖的时候除了版本号、组织名和结构名外,还有一个<scope></scope>
标签,他可以设定依赖的适用范围
值 | 主程序 | 测试程序 | 打包/运行 | 例子 |
---|---|---|---|---|
compile(默认) | √ | √ | √ | log4j |
test | - | √ | - | junit |
provided | √ | √ | - | servlet-api |
runtime | - | √ | √ | jdbc驱动 |
system | √ | √ | × | meavn以外的本地库 例如同项目其他模块 |
1 | <dependency> |
生命周期
clean
清理
default
核心工作。编译,测试,打包,安装,部署。
site
生成报告、发布站点
同一套生命周期中,按照顺序一步步进行,运行后面的生命周期会运行前面的生命周期
生命周期均由插件完成
插件不满足所需开发需求,可通过pom.xml 里
<plugins></plugins>
单独配置
分模块设计
项目按照功能分为若干模块,方便项目的管理维护、扩展,方便模块之间互相调用,资源共享
我们可以把项目从以下的形式变为
1 | | |
这一类的形式
1 | | |
拆分模块后,在开发的模块内引入pom
想要引入的模块
1 | <dependency> |
这样做的话,在别的项目想使用该设计的方法就可以只引入一小部分代码而不是整个项目,例如Mybatis作为一个sql使用率广泛的框架只需要引入包就可以使用,而不是把原始的项目都引入进来。
继承
当多个模块都使用同一个依赖时,可以设置额外全新的一个父模块,让父模块支持这个依赖,要使用这个依赖的多个模块继承父模块
也能做到依赖管理
例如新建SpringBoot工程就继承自父模块
1 | <parent> |
Meavn只能单继承,但是可以多重继承
因为SpringBoot默认已经有了继承,所以我们需要把父模块继承spring-boot-starter-parent
子模块再继承父模块
步骤:
建立父模块,并设置打包方式为pom,继承
spring-boot-starter-parent
1
2
3
4
5
6
7
8
9
10<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!--打包方式-->子模块设置继承没在
<relativePath> 填写父模块pom.xml路径</relativePath>
1
2
3
4
5
6<parent>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath> ../parent/pom.xml<!--相对路径--></relativePath>relativePath>
</parent>
父模块配置依赖
子模块会自动继承依赖
groupId会继承父模块的groupId
<relativePath>
不指定会从远程仓库和本地仓库查找子模块配置了相同的依赖不同的版本,以子模块为准(重写)
版本锁定
多个模块使用但是不是全部模块都使用的依赖,统一管理版本
步骤:
父模块使用
<dependencyManagement></dependencyManagement>
,在这里面引入依赖以及版本号1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<!--正常父模块依赖,被所有子模块继承-->
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--子模块选择继承的模块,统一指定版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.23.1</version>
</dependency>
</dependencies>
</dependencyManagement>子模块引入依赖,不需要指定版本号,没有引入依赖的不会引入父模块
<dependencyManagement>
里的依赖1
2
3
4
5<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<!--引入依赖,不需要输入版本号,由父模块统一指定-->
自定义属性
在依赖足够多,一个一个滑动查看<dependency></dependency>
去查找,修改版本号很繁琐,可以自定义属性在一个界面内快速修改版本号
例如:
1 | <properties> |
聚合
如果使用继承、分模块设计的话,在打包项目某个模块时需要在本地模块找到继承的父模块和依赖的模块,如果没有会打包失败
需要一个一个的安装好模块到本地仓库,十分繁琐
聚合:把多个模块构成一个整体,完成项目的构建
聚合工程:不具备业务功能的空工程,只有一个pom.xml
打包方式为pom!!!
1 | <packaging>pom</packaging> |
此时这个聚合工程进行打包就完成了
私服
sequenceDiagram 本地项目->>本地仓库: install 本地仓库->>私服: deploy Note right of 私服: 仓库(central)--中央仓库下载 Note right of 私服: 仓库(release)--发行版本仓库 Note right of 私服: 仓库(snapshot)--快照版本仓库 Note right of 私服: 打包vector如果是发行版本上传发行仓库,如果是快照版本就上传快照版本 Note right of 本地仓库: 配置私服用户名/密码 Note right of 本地仓库: 配置私服地址(url) Note right of 本地项目: 配置上传资源的地址(url)
配置私服的访问用户名/密码
打开本地meavn的
setting.xml
(apache-maven-3.9.6\conf\settings.xml),在<servers> </servers>
写入1
2
3
4
5
6
7
8
9
10
11
12<servers>
<server>
<id>meavn-releases</id>
<username>repouser</username>
<password>repopwd</password>
</server>
<server>
<id>meaven-snapshots</id>
<username>repouser</username>
<password>repopwd</password>
</server>
</servers>pom中配置上传地址
1
2
3
4
5
6
7
8
9
10
11<distributionManagement>
<snapshotRepository>
<id>meaven-snapshots</id>
<!-- id 名要与<server> </server> id名一致 -->
<url>127.0.0.1/snapshots</url>
</snapshotRepository>
<repository>
<id>meavn-releases</id>
<url>127.0.0.1/releases</url>
</repository>
</distributionManagement>
设置私服依赖下载地址
设置仓库组,把snapshots和releases等等仓库一起当为一个仓库组
配置的阿里云镜像仓库也是一个私服,只是公开出来了而已,所以要把阿里的
<mirror></mirror>
注释也可以是使用
<blocked>true</blocked>
设置禁止使用,需要使用的时候在修改为false或者注释
settings.xml
中
1 | <mirrors> |
<profiles></profiles>
中
1 | <profile><!-- 注意没有s 在有s中间添加--> |
在meavn默认配置中有示例:
1 | <profiles> |
此外可以单独配置单个项目的仓库镜像
附录 常见指令
maven 命令除了常用的几个,大部分经常记不住,整理一下,方便查询。
maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下,
- D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;
- P 指定 Profile 配置,可以用于区分环境;
- e 显示maven运行出错的信息;
- o 离线执行命令,即不去远程仓库更新包;
- X 显示maven允许的debug信息;
- U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次。
常用maven命令
- 创建maven项目:mvn archetype:create
指定 group: -DgroupId=packageName
指定 artifact:-DartifactId=projectName
创建web项目:-DarchetypeArtifactId=maven-archetype-webapp - 创建maven项目:mvn archetype:generate
- 验证项目是否正确:mvn validate
- maven 打包:mvn package
- 只打jar包:mvn jar:jar
- 生成源码jar包:mvn source:jar
- 产生应用需要的任何额外的源代码:mvn generate-sources
- 编译源代码: mvn compile
- 编译测试代码:mvn test-compile
- 运行测试:mvn test
- 运行检查:mvn verify
- 清理maven项目:mvn clean
- 生成eclipse项目:mvn eclipse:eclipse
- 清理eclipse配置:mvn eclipse:clean
- 生成idea项目:mvn idea:idea
- 安装项目到本地仓库:mvn install
- 发布项目到远程仓库:mvn:deploy
- 在集成测试可以运行的环境中处理和发布包:mvn integration-test
- 显示maven依赖树:mvn dependency:tree
- 显示maven依赖列表:mvn dependency:list
- 下载依赖包的源码:mvn dependency:sources
- 安装本地jar到本地仓库:mvn install:install-file -DgroupId=packageName -DartifactId=projectName -Dversion=version -Dpackaging=jar -Dfile=path
web项目相关命令
- 启动tomcat:mvn tomcat:run
- 启动jetty:mvn jetty:run
- 运行打包部署:mvn tomcat:deploy
- 撤销部署:mvn tomcat:undeploy
- 启动web应用:mvn tomcat:start
- 停止web应用:mvn tomcat:stop
- 重新部署:mvn tomcat:redeploy
- 部署展开的war文件:mvn war:exploded tomcat:exploded
1 |
|