1,maven简介
简单来说,maven就是管理项目的工具。
maven官网 http://maven.apache.org/
2,maven的安装和配置
maven的下载 http://maven.apache.org/download.cgi
首先确定jdk已经安装和配置
把maven解压到D盘
配置maven的环境变量 M2_HOME D:mavenapache-maven3.5.0 (我用的maven版本是3.5.0)
3,maven helloWorld 的实现
POM文件里一些信息
modelVersion:POM 模型版本 4.0.0 固定
groupId:一般指某个公司或者某个组织的某个项目 比如 org.springframework
artifactId:一般指某个具体项目的某个具体模块 比如 spring-context
Version:项目的版本
Maven Run as 常见命令
Mvn compile 编译
Mvn clean 清空
Mvn test 测试
Mvn package 打包
Mvn install 把项目安装到本地仓库
Mvn 远程仓库地址:http://mvnrepository.com/
4,maven本地仓库迁出C盘
D:apache-maven-3.5.0-binapache-maven-3.5.0confsetting
配置 setting 文件
<localRepository>D:maven epository</localRepository>
5,maven的核心技术
maven配置远程仓库
$M2_HOME/lib/maven-model-builder-3.5.0.jar
文件 :orgapachemavenmodelpom-4.0.0.xml
<repositories>
<repository>
<id>central</id>
<name>Central Reposity</name>
<url>https://repo.maven.apache.org/maven2 </url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
5.2,Maven依赖特性
依赖传递:
依赖选择(最短路径原则和最先申明原则)
如果a->b->c 并且 a->d 那么 a会先去依赖d 才回去依赖
最先申明原则 那个是最先声明的,就选择是那个依赖
依赖的传递性
a依赖b b依赖c 我们也可以说 a也依赖c
那么执行a时 c,b的jar会自动下载下来
2,依赖传递的排除
现在不想在执行a的时候吧C也下载下来 我们可以使用 <exclusions>标签。
<dependencies>
<dependency>
<groupId>B</groupId>
<artifactId>B</artifactId>
<version>0.0.1</version>
<exclusions>
<exclusion>
<!--被排除的依赖包坐标-->
<groupId>C</groupId>
<artifactId>C</artifactId>
<version>0.0.1</version>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3,依赖冲突与解决
依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?
冲突解决方案:
1:如果依赖路径的长度不同,则“短路优先”:
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
2:依赖路径长度相同情况下,则“先声明优先”:
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则在项目A的<depencies></depencies>中,E、F那个在先则A依赖哪条路径的X。
5.4,maven的聚合和继承特性
Maven聚合(或者称为多模块),是为了能够使用一条命令就构建多个模块
重新建立一个maven项目 只有一个pom.xml就行,别的骨架可以不要,例如有两个模块 service 和dao
<modules>
<module>../user-dao</module>
<module>../user-service</module>
</modules>
重新clean一下service 和dao 模块 刷新一下 target被清空
继承 新建maven user-parent 只有一个pom.xml就行 别的骨架可以不要,
在dao service pom文件中 在<modelVerion><modelVersion> 下面加一个 parent 标签 把新建的parent <modelVerion><modelVersion>和<packaging></packaging>之间的版本号 地址 名字 复制过去 在加一个寻找pom.xml的路径<relativePath>/parent pom文件的路径 ../user-parent/pom.xml</relativePath> 在user-dao里面可以除掉一些信息 <packaginng></packaging> 包装 只有web 是war 别的都是jar
maven提供了一个 <dependencyManagement></dependencyManagement>依赖管理 <dependencies></dependencies>
可以吧 两个文件中相同的配置 提取出来 放到parent pom.xml 中 例如配置 jstl junit log4j
可以用properties 对版本进行统一的管理 <properties><spring.version>4.1.7RELEASE<spring.version></properties>
在下面的spring配置 中 <version></version>标签里面可以改成<version>${spring.version}</version>
这样就方便了 版本的更新 管理
还可以把聚合pom.xml中的 <modules>
<module>../user-dao</module>
<module>../user-service</module>
</modules> 写到parent 中
聚合和继承可以放到一起
也算是方便管理吧
6,maven的依赖范围
如果当你自己的jar包 和 系统的jar包冲突的话 可以在对应的 配置语句下面加一个<scope>provided<scope>问题就解决了
classpath在maven里分为三种 编译classpath ,测试 classpath,运行 classpath
Scope选项如下:
Compile:编译依赖范围。默认就是compile。在编辑,测试 运行的时候都有效
test : 测试依赖范围 仅仅测试有效
provided:已提供依赖范围。编译,测试有效,运行时无效
System 系统依赖范围(了解即可)。
Import: 导入依赖范围(了解即可)。