MAVEN是基于POM(工程对象模型),通过一小段描述来对项目的代码、文件进行管理的工具。简单的说就是管理我们项目中依赖的包之间的关系。
MAVEN是一个跨平台的项目管理工具,它是使用java开发的,依赖于JDK1.6及以上。
Maven主要2大功能:管理依赖(jar包管理)、项目构建
maven官网链接
右键点击此电脑,点击高级系统设置
直接点击新建
配置如下配置:
MAVEN_HOME = D:\Maven\apache-maven-3.6.3
这个不配置好像也可以但是我看的狂神的视频说不配置后面有可能报错
M2_HOME=D:\Maven\apache-maven-3.6.3\bin
找到直接解压的目录 D:\Maven\apache-maven-3.6.3\conf下可以找到settings文件
这里设置的路径是我们本地仓库的位置,管理的所有的jar包的目录。不配置默认的本地仓库路径为 ${user.home}/.m2/repository 。由于时间久了这个目录很占空间,这个默认路径在C盘,所以建议配置在非C盘路径下
在53行左右复制出来修改为
<localRepository>D:\Maven\apache-maven-3.6.3\maven-repo</localRepository>
国外的服务器下载的很慢我们换成国内的源这里有3种写法好像都可以
在150行左右
<mirror>
<id>nexus-aliyunid>
<mirrorOf>*,!jeecg,!jeecg-snapshotsmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
<mirror>
<id>alimavenid>
<mirrorOf>centralmirrorOf>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/repositories/central/url>
mirror>
<mirror>
<id>aliyunmavenid>
<mirrorOf>centralmirrorOf>
<name>阿里云公共仓库name>
<url>https://maven.aliyun.com/repository/centralurl>
mirror>
<mirror>
<id>repo1id>
<mirrorOf>centralmirrorOf>
<name>central reponame>
<url>http://repo1.maven.org/maven2/url>
mirror>
<mirror>
<id>aliyunmavenid>
<mirrorOf>apache snapshotsmirrorOf>
<name>阿里云阿帕奇仓库name>
<url>https://maven.aliyun.com/repository/apache-snapshotsurl>
mirror>
注意要放在两个mirrors标签之间
190行左右
<!-- java版本 -->
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
Maven是在settings.xml文件中进行配置。
settings.xml文件一般存在于两个位置:
需要注意的是:局部配置优先于全局配置。
配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,会合并配置内容,如果有重复的配置,优先级高的配置会覆盖优先级低的
对项目进行编译,代码生成的文件都在target目录。
对项目进行打包。java项目打成jar包,web项目打成war包,在pom文件中可以配置。
对项目进行安装,把打包好的内容安装到本地仓库。
如果没有执行compile test package命令直接执行install命令则会默认先把compile、test、package执行一遍先。
对项目进行安装,把打包好的内容安装到本地仓库。
如果没有执行compile test package命令直接执行install命令则会默认先把compile、test、package执行一遍先。
下面我们将在IDEA中配置Maven,这样我们就能在IDEA中创建Maven项目了
点击File菜单 -> Settings -> Build Tools 找到Maven
主要配置:
当然光是这样,只能在当前项目里面改了,下一次再创建新的项目时,会发现还是默认的maven路径
不同版本的idea可能这里有点不一样,老版的好像是settings for others
然后重复刚才上面的配置即可
maven仓库中存放跟管理了大量的项目构建,在maven中坐标是为了定位一个唯一确定的包。我们在仓库中要找到我们需要的目标,只要知道目标的坐标即可。
groupId: 定义当前的Maven组织名称
artifactId: 定义实际项目名称
version: 定义当前项目版本号
简称GAV坐标,在pom.xml文件中的配置如下:
<groupId>com.blb.seven</groupId><!-- 组织名 -->
<artifactId>Hello</artifactId><!-- 项目名 -->
<version>0.0.1-SNAPSHOT</version><!-- 版本号 -->
在maven项目中,最重要的文件是pom.xml文件,所有的配置都在此文件中,包括最重要的依赖管理。每一个依赖都在dependencies标签下,通过GAV坐标引入我们需要的依赖。例子如下
<dependency>
<groupId>junit</groupId> <!-- 组织名 -->
<artifactId>junit</artifactId><!-- 项目名 -->
<version>4.11</version><!-- 版本号 -->
<scope>test</scope><!-- 范围 -->
</dependency>
在这个例子中除了GAV坐标以外,还有一个scope表示依赖的范围。
依赖范围(scope) | 对主代码有效 | 对测试代码有效 | 打包运行时有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | - | Y | jdbc Driver |
system | Y | Y | - |
有项目A、B、C。A依赖项目B,B依赖项目C,则A会间接依赖C中的所有依赖。A->B称为第一直接依赖,B->C称为第二直接依赖,A对于C是传递性依赖。
tip:
依赖不能形成闭环,比如A->B, B->C, C->A
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.7version>
<scope>testscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.8version>
<scope>testscope>
dependency>
在不同的pom文件中,如果存在2个冲突的依赖的话,先采用路径最短原则,路径相同再采用最先声明优先原则。
比如:A->B->C->X(1.0), A->D->X(2.0),1.0版本的X跟2.0版本的X都会传递到A,那么A究竟会使用哪个版本呢?前面A到X(1.0)路径是3,后面A到X(2.0)路径是2,所以采用路径最短原则,使用X(2.0)。
那么当路径相同时, A->B->Y(1.0), A->C->Y(2.0),Y(1.0)跟Y(2.0)到A的路径都是2,那么采用谁声明靠前就使用哪个版本的Y
当我们项目A依赖B,B依赖10个jar,则A间接依赖这10个jar,此时当我们依赖B的时候可以定义这10个jar中的哪些排除在外,不要依赖。这就叫做排除依赖。
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>5.2.4.RELEASEversion>
<exclusions>
<exclusion>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jclartifactId>
exclusion>
exclusions>
dependency>
当我们项目A依赖B,B依赖10个jar,则A间接依赖这10个jar,此时当项目B被依赖的时候可以定义哪些不给项目A依赖。这叫做可选依赖。
可选依赖跟依赖排除的区别是:可选依赖是我不给,依赖排除是我不要
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.8version>
<optional>trueoptional>
dependency>
POM项目对象模型把项目以面向对象的方式管理,项目之间可以有继承、聚合这些特性。
继承,项目之间可以继承,子项目可以继承父项目的依赖和插件
子项目的pom.xml中用parent继承父项目,父项目的打包方式必须是pom
<parent>
<artifactId>父项目artifactIdartifactId>
<groupId>父项目groupIdgroupId>
<version>父项目versionversion>
parent>
聚合,一个项目可以把多个项目整合到一起打成一个包,部署到一起,聚合项目用modules配置被聚合的项目
<modules>
<module>项目1module>
<module>项目2module>
modules>
继承和聚合一般一起使用,我们可以在一个大项目中创建多个子项目以完成不同的业务,子项目继承父项目,父项目聚合所有子项目
当子项目继承父项目则默认继承父项目所有的依赖,子项目很被动。子项目能不能选择性的接受呢?当然可以,只需要把父项目中的依赖都放入依赖管理器中即可,如
<!-- 父项目,把依赖放入依赖管理器中,这样子项目默认不继承任何依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
如果不在子项目中声明依赖,是不会从父项目中继承下来的;
只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;
另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
Maven仓库分为:
本地仓库
在本机保存jar包的目录
远程仓库
自己搭建的服务器,用于保存jar包文件,以提高jar下载速度和安全性
中央仓库
由maven团队维护的服务器,保存大量jar包
地址:https://repo1.maven.org 、 https://repo2.maven.org
这三种仓库工作的流程是:
当项目需要某个jar包时,先从本地仓库查找,如果有就返回,如果没有就到远程仓库查询,如果找到就返回jar包并保存到本地仓库,如果还没找到就到中央仓库查找,如果找到了就保存到远程仓库和本地仓库中,如果没有就查找失败了
@echo off
rem create by NettQun
rem 这里写你的仓库路径
set REPOSITORY_PATH=E:\Develop\maven_rep
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
echo %%i
del /s /q "%%i"
)
rem 搜索完毕
pause
创建一个bat文件,然后复制上述脚本进去,修改其中maven本地仓库的地址,保存后双击执行即可