为什么需要Maven
我们知道在学jdbc的时候我们对我们的java项目进行了导包。这些包其实并不好找,或者来自官网,或者来自网友的分享,或者来自项目团队的共享,不论何种方式,都需要把jar文件复制到lib目录中,并且buildpath。而且一旦是导入也很容易不兼容。Maven改变这种手动维护jar的方式,设计出一套自动维护jar的体系,已经广泛在软件项目中使用,是软件开发人员必须掌握的技术。
四大特征
Maven有一个创先河的发明,他发明了仓库,坐标,依赖,命令的pom模型。来帮助我们自动导包。
仓库 repository
当用户需要某个jar包时,先到本地仓库寻找,没有再去镜像仓库,没有再去中央仓库。中央仓库找到后,并不直接返回到本地仓库,而是保存一份到镜像仓库,镜像仓库返回本地仓库,本地仓库也保存一份,然后返回给调用者。
依赖 dependency
每个核心jar包形成一个依赖,maven底层进行它相关的jar的自动导入看例子:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
坐标 coordinate
坐标其实就是每一个jar包的地址,我们通过坐标来找到我们想要的包。类似于哪个省哪个市哪个县…
命令 mvn cmd
Maven借鉴前辈定义了一套生命周期。共有3个生命周期:clean、default、site,每个生命周期包含多个阶段phase。
命令名称 | 命令作用 |
---|---|
*clean | 清理 |
compile | 编译 |
*test | 测试 |
site | 站点文档 |
*package | 打包jar、war |
deploy | 部署到私服 |
*install | 安装jar到本地仓库中 |
run | 运行 |
这些看起来都很正常,接下来我要说的就很厉害了,Maven命令有一个强大的功能叫做一键部署。
每个周期中运行一个命令时,在这个周期里的其他在该命令之前的phase步骤都会执行。如:执行install会自动执行compile(编译java变成了class),test(运行所有单元测试类),package(把整个项目零碎的class文件打包为jar包),最终把成品jar发布到本地仓库中。但执行install并不会自动执行clean。也就是说他可以全自动的进行一部分命令,简化了我们程序员的很多事情。
安装
下载Maven
官网:http://maven.apache.org/download.html
设置镜像仓库
找文件:settings.xml
路径:apache-maven-3.6.3\conf\settings.xml
默认从maven官网下载,因为是国外网站,因此速度缓慢。所以配置为阿里镜像,速度快,但有时有错,如果有错,删除配置,默认从maven官网下载。
设置方式:
把这段代码复制到settings.xml文件中具体的位置大概在150多行。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
改变本地仓库位置
这个路径可以自行选择,不建议C盘。
<localRepository>D:\java\eclipseworkspace\env\mvnr</localRepository>
profiles简单maven信息
放入profiles标签内部
<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>
告诫
在setting.xml文件配置完以后,最好格式化xml,同时通过cmd mvn system:help
这个命令判断是否成功。
eclipse集成Maven
进入eclipse的preferences菜单,选中Maven项,将“Download Artifact Sources”打钩,
随后:Eclipse默认已经集成了maven(EMBEDDED),但我们基本不采用,据说有问题,我们习惯自己下载最新版本的maven,自行配置。选择安装的maven所在根目录,别忘记打钩哦。
此时已经可以创建Maven对象到此时可以说是成功了。
创建Maven工程
导入依赖
在pom.xml中加入下列代码即为导入mysql依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
idea导入maven
依赖冲突
我们在上边说过依赖有四种,compile,text,provided,runtime
我们可能会遇到一个情况就是A对于B是依赖的,B对于C是依赖的,那么A是不是相当于间接的依赖C,也就是说依赖具有传递性。
我们再做一个假设:A依赖B,B依赖C,C依赖D;另一个是A依赖B,B依赖D
此时我们就遇见了依赖冲突,Maven处理的方式是最短路径优先
但是我们如果两个路径一样长呢?
我们的第二原则是路径一样,先声明的优先
依赖排除
并不是所有时候我们都想要短路径优先,我们可以通过依赖排除,排除短路径,把下列代码放入依赖即可:
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
版本号共享
通常在项目中,我们会同时依赖同一个构件的不同模块,如 spring-orm-3.2.0,spring-context-3.2.0,且多个模块版本相同,为了维护和升级方便,我们可以对其同一管理,这时可以使用到 Maven 属性,类似于变量的概念。
定义方式:
<properties>
<junit.version>1</junit.version>
<spring.version>2.RELEASE</spring.version>
</properties>
调用方式:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
常见问题
1.查询最新版本和坐标网址: Maven Repository:Search
2.内存溢出:使用 mvn site会耗费大量内存,则修改默认配置
D:\javaenv\apache-maven-3.0.5\bin\mvn.bat
在@REM set MAVEN_OPTS=……后加入
set MAVEN_OPTS= -Xms128m -Xmx512m
3.版权导致jar远程仓库中没有
例如oracle、全文检索的IKAnalyzer分词器、Dubbox等。
解决办法:按maven坐标手动创建目录结构,将jar单独下载,放入其中