Maven基础
您的导航
一、maven概述
- maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model):项目对象模型
常常会在maven项目下看见这样一个文件
pom.xml(什么是XML文件?),相当于把项目看成了一个对象,对这个对象的描述就存在了这个文件中。
如果要做一个Java项目,首先要确定要引入哪些依赖,比如要用@Test注解来进行单元测试,就需要导入JUnit及相关的依赖包,
如果有打印日志,或是其他日志方面的需求,就可能需要log4j以及相关的依赖包。
其次,我们要确定目录结构。如src存放java代码,resources目录存放配置文件等。
还有很多难度不大,但琐碎且耗时的事情,且不方便同一管理。
Maven就是专门为了Java项目打造的管理和构建工具。
二、maven下载与配置
-
下载就去官网下载
-
解压到自己想解压的目录,这里以E:\apache-maven-3.6.1-bin\apache-maven-3.6.1为例。
-
配置环境变量
-
M2_HOME
变量值为:E:\apache-maven-3.6.1-bin\apache-maven-3.6.1\bin
-
MAVEN_HOME
变量值为:E:\apache-maven-3.6.1-bin\apache-maven-3.6.1
-
命令行输入:
mvn -version
- 如果配置成功,则会看到mvn的版本号。
三、maven基本概念
3.1 仓库
仓库:顾名思义,就是用来存资源的,maven中的仓库用于存储各种jar包。
远程仓库
中央仓库:maven有一个中央仓库,里面有很多jar包,我们需要用一些jar包时,就需要去中央仓库找。
私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源。
本地仓库
本地也可以存储一些jar包,我们从中央仓库或者其他仓库下载一些资源到本地,本地仓库就存储了资源。
这样就会出现一个问题:
中央仓库服务器在外网,下载速度极慢,我们就需要配置一个 镜像站(后面说),当我们访问中央仓库时,就会重定向到国内的某个镜像站,下载速度大大提高。
3.2 坐标
坐标:顾名思义,就是用于描述仓库中资源的位置。
maven坐标由三部分组成
- groupId:定义当前Maven项目隶属的组织名称。(通常是域名反写,如:org.mybatis)
- artifactId:定义当前maven项目的名称。
- version:版本号。
3.3 仓库配置
本地仓库配置:
默认本地仓库在用户的.m2目录下,但是c盘是系统盘,不适合存储大量资源,于是我们依自己的喜好去配置一下仓库的地址。
-
找到maven安装目录下的conf目录,conf目录下有一个setting.xml文件(什么是XML文件?)
-
setting.xml文件下找到localRepository标签,将其中的示例代码复制出来,中间填上自己本地仓库的地址。
如:
<localRepository>E:\apache-maven-3.6.1-bin\apache-maven-3.6.1\maven-repo</localRepository>
远程仓库配置:
配置远程仓库,修改 maven安装目录下的:/lib/maven-model-builder-${version}.jar中的\org\apache\maven\model\pom-4.0.0.xml文件,这个pom文件是所有maven pom的父pom,所有的maven项目继承该配置,将这个文件中的 <repositories>
标签下的url就可以修改远程仓库,但我们完全没有必要去修改这个文件(当然也没必要修改自己项目下的pom文件),我们只需要配置一个 镜像站 去 重定向一下我们访问的仓库,这里,我选择的是配置阿里云镜像站。
镜像站配置:
镜像站,故名思意,像一面镜子一样,里面装的资源和中央仓库基本一样,我们获取资源就不必去下载速度缓慢的国外服务器,只需到国内镜像站下载即可。
配置:
-
依然是conf目录下的setting文件。
-
找到
<mirrors>
标签。 -
添加一段代码:
<mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
这段代码的意思是:
将这个url作为central的镜子(central是中央仓库的id),这个镜子的id是alimaven,名字叫做aliyun maven。
名字可以重复,id不能重复。
-
配置成功!
四、Maven项目结构
4.1 手工构建一个maven项目
一个java项目的结构:
a-maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
└── target
一个web项目结构:
a-maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ │ └── webappp
│ └── test
│ ├── java
│ └── resources
└── target
-
a-maven-project是项目名。
-
main中java目录用来存放源码,test中Java用来存放测试源码的源码。
-
resources目录用来存放资源,配置文件。
-
所有编译、打包生成的文件都放在target中。
所有的目录结构都是约定好的标准结构,我们千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven就可以正常使用。
之所以这个项目能称之为maven项目,是因为这个pom.xml文件。
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>vip.yangsf</groupId>
<artifactId>maventest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
g、a、v三个标签无需再说,关键的是dependencies
标签
dependency是依赖的意思,<dependencies>
标签下就是放各种依赖的,对这些依赖的描述用<dependency>
包裹起来,当我们用<dependency>
声明一个依赖后,maven就会自动下载这个依赖包并把它放到classpath中。
现在我的结构大概长这样
创建好了以后,我们在命令行中,到项目目录下,输入mvn compile 命令编译这个项目。
既然说到构建命令,常用命令有这些:
mvn compile #编译
mvn clean #清理
mvn test #测试
mvn package #打包
mvn install #安装到本地仓库
测试可以生成测试报告,打包可以将整个项目打成jar包,install可以将包装进本地仓,clean可以删除target目录。
4.2 插件创建工程
就是可以用 mvn archetype:generate
命令加上一些参数用母版生成maven项目,但是手工输入比较麻烦,所以还是用idea生成方便。
4.3 idea创建maven项目
更详细的Javaweb项目创建请参阅:JavaWeb(一)开发前的准备
idea中使用maven可能会存在兼容问题,装3.6.1及以下版本就可以了(血与泪的教训)。
创建一个maven项目,有以下几个步骤:
4.3.1 创建普通maven项目
-
新建项目选择maven,然后下一步
-
设置项目名称,选择项目位置,设置好坐标(一般就改一下groupId),完成
-
文件 -> 设置中,构建工具中的几个路径如果不是自己的,就需要改一下
-
完成
-
4.3.2 创建webapp项目
-
新建maven项目,可以勾选模板,一般选择webapp(因为一般是用于web开发)
-
设置项目名称等
-
maven主路径要改成刚安装的maven安装路径
-
仓库就是刚创建的maven-repo目录
-
完成后等待初始化
配置和之前一样。
idea中可以看到右侧边栏上有个maven,点开它就可以很方便的管理maven项目。
4.4 项目构建生命周期
生命周期
maven构建生命周期描述的是一次构建过程经历了多少个事件。
- maven对项目构建的生命周期分为三步
- clean:清理工作
- default:核心工作,如编译、测试、打包、部署等
- site:产生报告,发布站点等
每一步中都要做很多事情,如果上一件事没做完,就不能做下一件事。
举个例子,执行test,如果test之前没有compile的话,就要先compile。
插件
-
插件会与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能。
-
默认maven在各个生命周期上绑定有预设功能。
-
可以配置插件。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <goals> <goal> jar </goal> </goals> <phase>generate-test-resources</phase> </execution> </executions> </plugin> </plugins> </build>
这就是配置了一个打包源码的插件,
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.0</version>
这一段是官网复制的,其他的意思是,这个插件是在generate-test-resources这个阶段执行,对源码进行打包。
之后maven的学习就可以在开发中探索。