目录
1.Maven简介
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
核心功能:
- 依赖管理:maven工程对jar包的管理。
- 一键构建:项目从编译、测试、运行、打包、安装, 部署整个过程都交给maven进行管理,每个过程对应一个maven命令。
mvn tomcat:run ====> 运行项目
2.安装配置
- 下载: http://archive.apache.org/dist/maven/maven-3/
- 解压: 注意路径没有中文,没有空格
- 配置环境变量:
新建 MAVEN_HOME maven解压的路径
编辑 Path 新建 %MAVEN_HOME%\bin - 测试: cmd ===> mvn -v
3.Maven仓库种类
- 本地仓库(默认是c盘,建议修改)
重新指定本地仓库: 在conf/setting.xml文件中添加:
<localRepository>指定文件夹</localRepository> - 远程仓库(私服)
- 中央仓库(几乎所有开源的jar包)]
- 仓库间的关系:
启动maven工程,maven会通过pom文件的jar包坐标去本地找对应jar包
默认情况下,如果本地仓库没有jar包,会自动去中央仓库下载
在公司中,如果本地没有,会先从私服上下载,如果私服没有,可以从中央仓库下载,也可以本地上传
4.目录结构
web工程(java工程只包含前四个):
src/main/java ----> 核心代码部分
src/main/resources ----> 配置文件部分
src/test/java ----> 测试代码部分
src/test/redources ----> 测试配置文件
src/main/webapp ----> 页面资源:js、css、html等
5.常用命令
mvn clean —> 删除编译好的本地项目信息(删除target目录)
mvn compile —> 将src/main/java代码进行编译放置在target目录下
mvn test —> 编译src/main/test和src/main/java下的java代码
mvn package —> 将项目进行打包(同时会编译)放在target目录下(至于是war包还是jar包由pom.xml中的配置决定)
mvn install —> 将代码进行编译并打包,并把包放在本地仓库下
mvn deploy —> 部署项目,包含了前面5个命令
6.生命周期(3套)
清理生命周期
清除项目编译信息 ====> clean
下面的五个命令就是一个默认的生命周期,执行后面的命令前面的命令也会执行一遍
编译 ====> compile
测试 ====> test
打包 ====> package
安装 ====> install
发布 ====> deploy
站点生命周期(知道有这个概念就好)
7.概念模型图
8.Maven工程运行环境修改
<build>
<plugins>
<!-- maven构建Springboot -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--指定端口号-->
<port>8080</port>
</configuration>
</plugin>
<!--jdk8插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
9.依赖范围
10.Maven的依赖传递、依赖冲突及解决办法
从图中可以看出,项目中直接依赖spring-mvc,而spring-mvc依赖了spring-aop、spring-beans等,最终结果就是项目中间接依赖了spring-aop、spring-beans等。这就是依赖的传递。
如果项目A依赖项目B的版本1,项目C依赖项目B的版本2,如果在我们的项目中同时引入A和C,由于有依赖传递,项目B的版本1和版本2就会造成冲突,这就是依赖冲突。
依赖冲突解决办法:
1、使用Maven提供的依赖调解原则
- 第一声明者优先原则
以先声明的为准,即在pom.xml文件中以上面的依赖为准。 - 路径近者优先原则
以spring-mvc为例,项目中引用此依赖,而spring-mvc依赖了spring-aop,如果直接在项目中引入spring-aop,则以直接引入的为准
2、排除依赖
使用exclusions标签将传递过来的依赖排除出去
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
</exclusions>
</dependency>
3、版本锁定
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中。此方法在企业中经常使用
使用方式:
第一步:在dependencyManagement标签中锁定依赖的版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
第二步:在dependencies标签中声明需要导入的maven坐标
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
</dependencies>