Maven基础
1.Maven简介
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
Maven是用Java语言编写的。他管理的东西统统以面向对象的形式进行设计,最终他把一个项目看成一个对象,而这个对象叫做POM(project object model),即项目对象模型
- 依赖管理就是maven对项目所有依赖资源的一种管理,它和项目之间是一种双向关系。
- maven依赖管理存储三个位置:本地仓库,私服,中央仓库
- Maven除了帮我们管理项目资源之外还能帮助我们对项目进行构建,管理项目的整个生命周期.
Maven的作用
(1)项目构建:提供标准的,跨平台的自动化构建项目的方式
(2)依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突等问题
(3)统一开发结构:提供标准的,统一的项目开发结构
各目录存放资源类型说明:
src/main/java:项目java源码
src/main/resources:项目的相关配置文件(比如mybatis配置,xml映射配置,自定义配置文件等)
src/main/webapp:web资源(比如html,css,js等)
src/test/java:测试代码
src/test/resources:测试相关配置文件
src/pom.xml:项目pom文件
2.Maven环境搭建
apache-maven-3.6.1-bin.zip
直接解压到D盘根目录下即可
各目录结构说明:
bin:可执行程序目录,
boot:maven自身的启动加载器
conf:maven配置文件的存放目录
lib:maven运行所需库的存放目录
需要java环境,java环境配置点此链接
maven环境变量配置
此电脑右键属性->高级系统设置->环境变量->系统变量
变量名:MAVEN_HOME
变量值:D:\maven\apache-maven-3.3.9
变量名:Path
变量值:%MAVEN_HOME%\bin
验证:win + R -> cmd -> mvn -v
出现:Apache Maven 3.3.9则安装成功
3.Maven基础概念
仓库:用于存储资源,主要是各种jar包
中央仓库:maven团队自身维护的仓库,属于开源的
私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源
本地仓库:开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源
坐标:maven中的坐标用于描述仓库中资源的位置
坐标作用:使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
groupId:定义当前资源隶属组织名称(通常是域名反写,如:org.mybatis)
artifactId:定义当前资源的名称(通常是项目或模块名称,如:crm,sms)
version:定义当前资源的版本号
packaging:定义资源的打包方式,取值一般有如下三种
(1)jar:该资源打成jar包,默认是jar
(2)war:该资源打成war包
(3)pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个pom.xml不生成jar或其他包结构
仓库配置
选择在全局进行配置,在maven的配置文件conf/settings.xml
中可以找到它的说明,在系统盘当前用户目录下的.m2/repository
默认位置
<localRepository>C:\Users\${user.home}\.m2\repository</localRepository>
指定一个新的位置作为本地仓库的位置:maven配置文件conf/settings.xml中添加
<localRepository>D:\maven-repository</localRepository>
局部用户配置:在仓库的同级目录也可以包含一个settings.xml
配置文件,在里面也可以进行指定.
maven默认连接的远程仓库位置是:(即中央仓库);可以配置一个国内站点镜像,可用于加速下载资源.
在conf/settings.xml
配置文件中找到<mirrors>
标签,在这组标签下添加镜像的配置
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4.Maven项目搭建
通过maven来构建项目
mvn compile
:编译
mvn clean
:清理
mvn test
:测试
mvn package
:打包
mvn install
:安装到本地仓库
(1)win+R然后cmd进入项目文件中pom.xml文件所在目录,执行mvn compile
进行源码编译
目录target
下存放的是maven编译好的一些东西,其中生成的classes
目录就是编译好的字节码文件.
(2)如果想清理掉这些东西,只需执行mvn clean
命令即可,清理掉后target
目录也就消失了
(3)如果要执行测试包中的测试程序,只需执行mvn test
命令即可
此时在看target
目录会多一些东西,其中产生的test-classes
就是测试代码的字节码文件,surefire-reports
是它产生的测试报告.
(4)使用mvn package
命令进行打包;执行mvn package
命令的时候maven会把前面两个命令mvn compile,mvn test
都执行一遍
(5)使用mvn install
命令进行安装,将项目打好的包存入本地仓库
maven是按照groupId/artifactId/version
的结构在本地仓库进行存储
maven项目搭建方式:
- 手动搭建,创建文件夹的方式
- 插件搭建,通过mvn命令调用插件搭建
- Idea搭建,常用
IDEA工具搭建maven项目
注意:Maven和IDEA在版本上存在一些兼容性问题,要合理的选择Maven和IDEA的版本
不使用原型创建项目
(1)在IDEA中配置Maven
(2)创建maven工程
(3)查看各目录颜色标记是否正确
(4)IDEA右侧有一个maven管理界面,可点开查看
(5)在项目的pom.xml文件中添加项目资源依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
(6)java中创建源代码
package com.emprock;
public class Main {
public String say(String name){
System.out.println("hello "+name);
return "hello "+name;
}
}
(7)test中创建测试代码
package com.emprock;
import org.junit.Assert;
import org.junit.Test;
public class ApplicationTest {
@Test
public void testSay(){
Main d = new Main();
String ret = d.say("maven");
Assert.assertEquals("hello maven",ret);
}
}
(8) 进行测试运行
(9)编辑运行模板运行
使用原型创建项目
(1)创建maven项目的时候选择使用原型骨架
常用的选择maven-archetype-quickstart或者maven-archetype-webapp
(2)需要手动去补全目录,并且要对补全的目录进行标记,切记
固定需要的目录结构有
- 创建java代码(源代码)所在目录,即创建
src/main/java
- 创建配置文件所在目录,即创建
src/main/resources
- 创建测试源代码所在目录,即创建
src/test/java
(非必需) - 创建测试存放配置文件存放目录,即
src/test/resources
(非必需) src/main/java
中创建包及.java文件
(3)web工程创建好之后需要启动运行,需要使用一个tomcat插件来运行项目,在pom.xml
中添加插件的坐标即可,最终改好的pom.xml
如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion><!--指定pom的模型版本-->
<groupId>org.example</groupId><!--组织id-->
<artifactId>maven-hello</artifactId><!--项目id-->
<packaging>war</packaging><!--打包方式,web工程打包为war,java工程打包为jar-->
<version>1.0-SNAPSHOT</version><!--版本号-->
<name>maven-hello Maven Webapp</name><!--项目名-->
<url>http://maven.apache.org</url>
<dependencies><!--设置当前工程的所有依赖-->
<dependency><!--具体的依赖-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build><!--构建-->
<finalName>maven-hello</finalName>
<plugins><!--设置插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
(4)插件配置好后,在IDEA右侧maven-project
操作面板上可以看到该插件,并且可以利用该插件启动项目,并在浏览器中访问地址
如果我们想更换端口,只需要在pom.xml
中配置该插件即可
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
</configuration>
</plugin>
(5)同时为了运行方便我们也可以创建运行模板:
5.Maven依赖管理
依赖配置
依赖是指在当前项目中运行所需的jar,依赖配置的格式如下:
xml
<!--设置当前项目所依赖的所有jar-->
<dependencies>
<!--设置具体的依赖-->
<dependency>
<!--依赖所属群组id-->
<groupId>junit</groupId>
<!--依赖所属项目id-->
<artifactId>junit</artifactId>
<!--依赖版本号-->
<version>4.12</version>
</dependency>
</dependencies>
依赖传递:
(1)直接依赖:在当前项目中通过依赖配置建立的依赖关系
(2)间接依赖:被依赖的资源如果依赖其他资源,则表明当前项目间接依赖其他资源
依赖传递的冲突优先级:
(1)路径优先:当依赖中出现相同资源时,层级越深,优先级越低,反之则越高
(2)声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖靠后的
(3)特殊优先:当同级配置了相同资源的不同版本时,后配置的覆盖先配置的
可选依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--对外隐藏当前所依赖的资源-->
<optional>true</optional>
</dependency>
排除依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--主动断开依赖的资源,被排除的资源无需指定版本-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖范围
依赖的jar默认情况可以在任何地方可用,可以通过scope
标签设定其作用范围
有三种范围
(1)主程序范围有效(src/main目录范围内)
(2)测试程序范围内有效(src/test目录范围内)
(3)是否参与打包(package指令范围内)
此外:scope
标签的取值有四种:compile,test,provided,runtime
compile(默认)权限123
test权限2
provided权限12
runtime权限3
6.Maven生命周期与插件
**生命周期 **
maven的构建生命周期描述的是一次构建过程经历了多少个事件,总共分为3套,每套里面包含的事件简略版如下
(1)clean:清理工作
clean:移除上一次构建产生的所有文件
(2)default:核心工作,例如编译,测试,打包,部署等
compile
:编译
test-compile
:编译测试源码
test
:测试
package
:打包
install
:安装到本地仓库
对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍
(3)site:产生报告,发布站点等
site:生成项目的站点文档
site-deploy:将生成的站点文档部署到特定的服务器上
插件
执行事件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件
- maven默认在各个生命周期上都绑定了预先设定的插件来完成相应功能
- 插件还可以完成一些自定义功能
案例:
<plugins>
<plugin>
<!--添加source执行位置插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>