Maven
一、Maven的作用
1.传统项目管理状态分析
- jar包不统一,jar包不兼容
- 工程升级维护复杂
2.Maven是什么
-
Maven本质**是一个项目管理工具**,将项目开发和管理过程抽象成一个项目对象模型(POM:Project Object MOdel)
-
一个项目创建一个pom.xml
3.Maven可以干什么
-
项目构建:提供标准的、跨平台的自动化项目构建方式
-
依赖管理:方便快捷的管理项目的依赖资源(jar包),避免资源版本的互相冲突
-
统一开发结构:提供标准的、统一的项目结构
二、Maven下载和安装
1.下载
-
下载地址
官网:http://maven.apache.org/
下载地址:http://maven.apache.org/download.cg
-
解压到任意位置
2.环境配置
-
Maven依赖于java,需要配置JAVA_HOME
-
配置MAVEN_HOME
-
系统变量中新建一个**MAVEN_HOME,值是Maven的安装目录**
-
在Path中添加一个路径**%MAVEN_HOME%\bin**
-
cmd中输入mvn,如果出现任务指令,则说明配置成功
-
2.目录介绍
- bin:可运行指令
- boot:里面有一个jar包,是Maven的类加载器
- conf:存放Maven的配置文件
- lib:存放Maven运行的jar包
三、Maven基本概念
1.仓库
- 用于存储资源,包含各种jar包
1.仓库的分类
-
远程仓库:为本地仓库提供资源
- 中央仓库:Maven官方的服务器,存放着所有的的jar包
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
-
本地仓库:保存在自己计算机上的jar包
2.私服的作用
- 保存具有版权的资源,包含购买或自主研发的jar
- 中央仓库中的jar都是开源的,不能存储就有版权的资源
- 一定范围内共享资源,仅对内部开发,不对外共享
计算机先访问本地仓库,如果有直接获取;没有会让从私服获取;私服没有就回去访问中央仓库,私服获取之后,返回给本地服务器
2.坐标
1.坐标的概念
-
概念Maven中的坐标用于描述仓库中资源的位置
-
作用:通过该标识,可以将资源的识别与下载工作交给机器完成
2.坐标的主要组成(g,a,v)
- groupId:当前Maven项目隶属组织名称+项目名(通常是域名反写,例如:org.mybatis)
- artifactId:定义当前Maven模块名称(通常是模块名称)
- version:定义当前版本号
- packaging:定义该项目的打包方式(不属于坐标的组成)
3.获取jar包的坐标
-
访问maven的仓库地址:mvnrepository.com
-
输入需要的jar包名称
-
选择jar包的版本号
-
新的页面中有一个Maven的框,复制即可
四、仓库配置
1、本地仓库配置(资源下载到哪里)
-
在任意位置创建一个文件夹
-
在文件夹里面创建一个文件夹:repository
-
打开maven安装目录下的conf文件夹
-
打开里面的settings.xml文件
-
复制下面的代码到里面
<localRepository>创建的repository文件夹地址</localRepository>
2、远程仓库配置(资源从哪里来)
-
打开maven安装目录下的conf文件夹
-
打开里面的settings.xml文件
-
找到mirror标签
-
复制注释中的一份到mirror标签中
<mirror> <id>huaweicloud</id> <name>mirror from maven huaweicloud</name> <mirrorOf>central</mirrorOf> <url>https://mirrors.huaweicloud.com/repository/maven/</url> </mirror>
五、第一个Maven项目(手动)
1.Maven工程目录结构
- main:用来写java程序
- test:用来写测试程序
- java:用来存放java源文件
- resources:用来存放资源文件
2.项目构建命令
构建命令需要在pom.xml的包下使用
六、第一个Maven项目(插件创建Maven工程)
1.创建java工程
-
cmd移动到一个空目录
-
输入下面的命令
mvn archetype:generate -DgroupId=包名 -DartifactId=项目名称 -DarchetypeArtifactId=maven-archetype-quickstart -Deversion=项目的版本号 -DinteractiveMode=false
2.创建web工程
-
cmd移动到一个空目录
-
输入下面的命令
mvn archetype:generate -DgroupId=包名 -DartifactId=项目名称 -DarchetypeArtifactId=maven-archetype-webapp -Deversion=项目的版本号 -DinteractiveMode=false
-
java的包需要自己造
七、第一个Maven项目(IDEA生成)
1.配置Maven
2.手工创建java项目
-
创建模块,选择Maven
-
选择填写模块的Maven的坐标,然后一路next
-
设置界面进入项目结构,给包配置对应的属性
-
进入pom.xml配置文件,打上需要用的jar包,写完之后需要点击右边的刷新
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
-
构建项目
3.使用Maven模板创建java工程
-
选择模块,新建一个maven模块,勾选Create From archetype(使用模板),然后选择quickstart
-
修改GroupId和ArtifactId,然后一路next
-
然后在项目目录的main、test包下新建resources包
-
右键新建的resources包,选择Mark Directory as–》Sources Root
4.使用Maven模板创建web工程
-
选择模块,新建一个maven模块,勾选Create From archetype(使用模板),然后选择webapp
-
修改GroupId和ArtifactId,然后一路next
-
在main包下创建java包,在src目录下创建test包,在test包下创建java、resources包
-
然后给包相应的颜色
4.tomcat插件安装与web工程的启动
- build:打的是插件
-
修改模块下的pom.xml文件,将里面的东西先删除一部分
<?xml version="1.0" encoding="UTF-8"?> <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> <packaging>war</packaging> <name>web01</name> <groupId>com.junqing</groupId> <artifactId>web01</artifactId> <dependencies> </dependencies> </project>
-
打开maven坐标库,搜索**tomcat maven**,找到org.apache.tomcat.maven的包
-
选择2.1版本,复制
-
打开pom.xml文件,先设置一个build标签,然后使用plugins标签,然后使用plugin标签
-
将复制的标签粘贴到里面,把粘贴的标签dependency标签删掉
<!--构建--> <build> <!--设置插件--> <plugins> <!--设置具体插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>
-
然后刷新maven,加载资源
-
然后使用maven的tomcat插件,运行项目,启动成功之后就会给一个地址,点击就可以访问项目
-
如果需要修改端口:在配置第五步里面添加configuration标签
<!--配置--> <configuration> <!--修改端口号--> <port>80</port> <!--修改路径--> <path>/</path> </configuration>
-
如果嫌启动麻烦:可以配置一个按钮
5、pom配置文件说明
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--指定pom的模型版本(不用修改)-->
<modelVersion>4.0.0</modelVersion>
<!--打包方式:web工程为war,java工程为jar-->
<packaging>war</packaging>
<!--name没用-->
<name>Test02</name>
<!--通常为域名反写-->
<groupId>com.junqing</groupId>
<!--项目id:通常是项目名-->
<artifactId>Test02</artifactId>
<!--版本号(随便写):release(完成版),SNAPSHOT(开发版)-->
<version>1.0-SNAPSHOT</version>
<!--设置当前工程的所有依赖-->
<dependencies>
<!--当前工程的具体依赖-->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>
</dependencies>
<!--构建-->
<build>
<!--设置插件-->
<plugins>
<!--设置具体插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--配置-->
<configuration>
<!--修改端口号-->
<port>80</port>
<!--修改路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
八、依赖管理
- 依赖指当前项目运行所需要的jar,一个项目可以设置多个依赖
1.配置项目依赖
配置依赖的方式:在pom.xml中的dependencies中添加dependency(可以有多个)
<dependencies>
<!--具体依赖(可以有多个)-->
<dependency>
<groupId>log4j</groupId><!--群组id-->
<artifactId>log4j</artifactId><!--项目id-->
<version>1.2.14</version><!--版本号-->
</dependency>
<!--第二个具体依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.依赖传递
1.依赖传递的概念
例如:项目2需要用到项目3,这个时候需要把项目3作为资源配置到项目2中
2.传递依赖的配置方法
把被调用的项目坐标配置到调用项目的dependency中
<!--配置依赖-->
<dependency>
<groupId>com.junqing</groupId>
<artifactId>Test01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3.依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在同层被依赖时,谁先被配置,谁先被使用
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
3.可选依赖(别人能不能看见)
-
对外隐藏当前所依赖的资源
-
所添加的依赖中加一个**optional标签**
<dependency> <groupId>com.junqing</groupId> <artifactId>Test01</artifactId> <version>1.0-SNAPSHOT</version> <optional>true</optional><!--隐藏起来,别人就看不见了--> </dependency>
4.排除依赖(主动不要别人的某个资源)
- 例如:排除掉项目三中的log4j
<!--不要它里面的log4j-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
5.依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
6.依赖范围传递性(了解即可)
带有依赖范围的资源在进行传递时,作用范围将受到影响
九、生命周期与插件
- 各个构件环节执行的顺序不能被打乱,必须按照规定的正确顺序来执行
- Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务由插件来完成
- Maven核心程序为了更好的实现自动化构建,按照这样的特点执行生命周期中的各个阶段:不论要执行哪一阶段,都会从第一步开始执行(生命周期的第一步开始)
1.项目构建生命周期
- clean:清理工作
- default:核心工作,例如编译,测试,打包,部署
- site:产生报告,发布站点
1.1、clean生命周期
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
1.2、default(构建)生命周期
下面的会把上面的全部执行
例如:
- test会把上面的都执行
- package会把他上面的都执行
2.插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认maven在各个生命周期上已经绑定了预设功能
- 通过插件可以自定义其他功能
-
插件的使用
<!--构建--> <build> <!--设置插件--> <plugins> <!--设置具体插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <!--执行什么动作--> <executions> <!--具体执行什么动作--> <execution> <goals> <!--将源码打包--> <goal>jar</goal> </goals> <!--什么时候执行--> <phase>generate-resources</phase> </execution> </executions> </plugin> </plugins> </build> <plugins> <!--设置具体插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <!--执行什么动作--> <executions> <!--具体执行什么动作--> <execution> <goals> <!--将源码打包--> <goal>jar</goal> </goals> <!--什么时候执行--> <phase>generate-resources</phase> </execution> </executions> </plugin> </plugins> </build>