先认识什么是maven?
maven是一个java平台下的的软件项目管理和综合工具
由Apache组织中开发维护,基于项目对象模型的概念
简单来说maven可以做什么?
maven可以根据一个中心信息来管理项目的构建,文档和报告的生成,这里的报告是测试报告;
为何需要maven
在日常开发工作中,开发者需要自行管理项目依赖,频繁的编译,清理,测试,打包,发布等等…虽然IDE都提供了相应的支持,但也免不了我们需要,花很多时间进行这些重复且没有技术含量的工作,我们将上述这些过程统称为项目构建
Maven的出现正是为了将开发者从繁杂的项目构建中解放出来
那么详细说Maven能做什么
1.使得构建项目过程变得更简单
Maven不会消除对底层机制的了解,没有太过高级的封装,但可以让你免受许多细节的影响
2.提供了统一的构建系统
Maven使用其项目对象模型(POM)和一组插件来构建项目,一旦熟悉了一个Maven项目,就知道所有Maven项目是如何构建的;
3.提供了项目质量信息
这些信息部分来自POM,部分来自项目源代码,如:项目使用的依赖项,单元测试报告(包括覆盖率),交叉引用等
4.鼓励更好的开发实践
Maven收集了当前的最佳开发实践,并轻松地朝该方向指导项目。例如:单元测试的规范化,将测试的执行和报告作为Maven的常规构建周期的一部分,Maven还建议了一些有关项目目录结构的准则,Maven还协助项目工作流程,例如发布和问题管理等。
Maven相关概念
POM(项目对象模型)
Maven整体采用的就是POM,既将项目看做一个对象,而对象有属性和行为,我们可以对这个项目对象进行相关属性的设置,从而来完成项目的管理
一个POM可继承其他POM从而使用其中已经定义好的内容;
可将一个Maven项目拆分为多个不同Maven模块(方便进行解耦与职责划分),只需要在POM中列出包含的模块信息即可;
repository(仓库)
所有Maven项目都具备自己的坐标,包括组织ID,坐标ID和版本号,有了坐标后,可将项目放入仓库中,以供其他人使用。
仓库可以干什么?
仓库就是用来存放这些项目的地方,其实就是存储我们所需要的jar包,本质就是一个文件夹,分为本地仓库,和远程仓库,以及中央仓库
中央仓库也属于远程仓库,是有maven官方维护的仓库,是最完整的jar仓库,为了区别于其他仓库,所以称之为中央仓库,不过因为部署在国外,所以速度比较慢。
Dependency Management(依赖管理)
依赖指得是项目运行所必须的组件(可以是jar,java,class)
依赖管理是Maven提供的最核心的功能之一,可根据提供的项目坐标,自动的从仓库中下载需要的依赖,并且会帮助我们解决依赖冲突问题,
Project Lifecycle(项目生命周期)
项目生命周期指得是项目从创建工程开始到最终部署到服务器的所有动作(程序员要干的事情)的总称,如编译,测试,打包,部署,生成项目站点等…
Maven对这些动作进行了抽象,变成了一个个生命周期
生命周期
生命周期动作本质都是通过插件来完成的,所以Maven项目默认就存在与生命周期相关的几个插件,具体如下:
三个生命周期:
1.默认(default)的生命周期,处理从验证开始执行所有阶段一直到部署
2.清洁(clean)生命周期,处理项目的清理操作
3.站点(site)生命周期,处理项目站点的创建和部署
阶段
每个生命周期下包含若干个阶段,以下列出重要阶段(不区分周期)
安装与配置
下载安装
下载地址:https://maven.apache.org/download.cgi
正常使用下载binary二进制版本,需要查看源码则下载源码
下载后直接解压即可,CMD中使用需设置环境变量,Maven不区分版本,bin下提供了用于unix的sh和用于windows的cmd文件,将bin添加至环境变量即可;添加环境变量后我们就可以,使用在命令行中使用mvn命令了
目录:
另外:IDEA中已经集成了Maven,无需额外安装,也不需要任何的命令
IDEA下配置Maven
在IDEA中我们可以自定义本地仓库路径和配置文件,在File—>setting中搜索Maven,可打开如下界面:
放大版
从上到下,分别是**,Maven路径,配置文件,仓库路径**,分别从上到下如下:
第一个:IDEA默认使用自己集成的Maven,若需要可以指定为自己安装的maven解压后的文件目录
第二个:选择配置文件,选中override,进行修改,找到D:\maven\conf\settings.xml(我的是在D盘)或repository下粘贴过去的settings.xml皆可,不过两文件要一致。
第三个:本地仓库路径,也就是我们自己创建的repository文件夹
开始使用
IDEA中Maven使用步骤简述
step1:创建Maven项目
step2:指定仓库地址,以及配置文件(仅第一次)
step3:编辑pom.xml配置文件,(项目坐标,依赖,插件等…)
step4:使用命令或插件来帮助完成要进行的构建工作
创建Maven普通项目
骨架即模板,主要是为了帮助我们创建可能用到的目录结构
此处不选择骨架
输入项目名称,组织表示符(公司域名倒序),以及项目ID:
next后出现下图,继续next
创建完成后,右下角会出现,点击圈圈里的即可。
创建成功后,目录如下:
速度会有点慢。。。。。。
查找需要的依赖
中央仓库地址:https://mvnrepository.com,我们可以在上面查找需要的jar包
举个例子
选择版本
复制依赖
将复制的内容填写到pom.xml中的dependencies下即可
但是我们发现,速度实在是太慢了。。。。。。
此时就需要
镜像仓库
Maven默认访问中央仓库来获取依赖,一些时候可能会很慢,我们可以在配置文件中添加镜像服务器来解决这个问题
需要强调的是,镜像仓库的jar包通常没有中央仓库齐全
根据idea的maven配置找到settings.xml文件在mirrors标签下添加内容
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
接着书写一个案例
依赖下载完成后我们就可以开始编写代码了
public class MavenDemo {
public static void helloWorld(){
System.out.println("hello world!");
}
public static void main(String[] args) {
helloWorld();
}
}
实际开发中,我们通常使用Junit进行测试
step1:添加Junit依赖
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
step2:编写测试代码
import org.junit.Test;
public class MavenDemo {
@Test
public void Test1(){
System.out.println("hello");
}
}
step3:在idea右侧会有Maven的菜单,其中会显示maven提供的各个插件,双击即可执行,测试我们执行test
常见错误
当我们在执行test以下的阶段时maven会抛出以下异常:
不再支持源选项 5。请使用 6 或更高版本。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
以上方式只针对当前项目有效,当重新创建项目时又需要重新写一次,针对该问题,应该把编译级别的设置放到全局配置文件中,可以通过在settings.xml添加通用配置来解决:
根据idea中的配置信息找到settings.xml文件,在profiles
标签中添加以下内容:
这是由于Maven默认编译版本为1.5,目前已经不受支持,我们需要在pom添加以下内容,用于指定编译版本和编码方式:
<profile>
<id>jdk-1.8</id>
<activation> <!-- 配置激活条件 -->
<activeByDefault>true</activeByDefault> <!-- 是否是默认配置 -->
<jdk>[1.8,)</jdk> <!-- 当jdk版本 >=1.8时配置生效 -->
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</profile>
当配置被激活时,将应用到项目中的且覆盖pom中相同标签;
配置完成重新执行test即可查看到测试输出的信息:
其他常用操作
1.重新导入Maven项目,相当于刷新
2.更新所有Maven项目资源和文件夹
3.下载依赖和源码
4.添加新的Maven项目
5.运行某个生命周期指令
6.运行自定义指令
7.显示依赖关系图
8.关闭已展开
创建web项目
点击Create New Project选中maven如下:
点击next后
从上往下依次是:
GroupId:组织ID,一般是公司域名反写
ArtifactId:项目Id,项目名
Version:版本信息,版本号
继续next,配置maven,如果是第一次可能需要配置
继续next,会让你确认
检查还可以,就finish就行了,这时候就完成创建了
这时候右下角会出现
选择自动导入即可。
此时的项目结构不完整,
进行手动操作:
然后分别建立
鼠标在上层文件夹,右键,选择new folder , 创建以上文件夹src下有以下文件夹,结构如下:
main:
java:存放Java代码
resources:存放配置资源文件,如 xml文件
webapp:存放页面,静态资源
test
java:存放java测试代码
点击ok,项目结构就基本完善了,如下:
至此还有一个小问题在于:web.xml,从骨架创建的web.xml配置不是很全,下面是web.xml配置,也可以在本地文件自己复制粘贴修改文件,也可以删除后自己重新生成,可以自行百度:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
另一种创建webapp方式
1.先创建一个普通的maven项目
2.pom中添加<packaging>war</packaging>
3.手动在main下创建webapp目录
4.创建web.xml,在右上方
记:src\main\webapp
在弹出的窗口中指定将web.xml创建到webapp目录下:
运行WEB项目
Maven项目的运行与普通项目没有太大的区别,不过我们还可以通过Maven插件来运行web项目,tomcat和一些常见服务器都有Maven插件
需要强调的是,Tomcat的Maven插件,最后一次更新是8.x版本,如果要使用最新的web服务器还是需要单独下载
1.原始方式配置外部Tomcat个人还是习惯于原始方式,插件方式太麻烦
2.插件方式
2.1添加插件配置到pom.xml
<build>
<finalName>MavenP4</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
2.2添加运行配置
上述操作等同于在控制台输入指令mvn tomcat7:run
添加servlet依赖:
当需要使用servlet时,与非maven项目一样需要添加servlet的依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
deploy
deploy是将打包的结果部署到服务器,因此需要指出服务器的地址,支持的上传方式有SSH,FTP
FTP案例:
<distributionManagement>
<repository>
<id>ftp-repository</id>
<url>ftp://repository.mycompany.com/repository</url>
</repository>
</distributionManagement>
<build>
<extensions>
<!-- Enabling the use of FTP -->
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-beta-6</version>
</extension>
</extensions>
</build>
在settings.xml中找到servers标签添加ftp的用户名和密码:
<server>
<id>ftp-repository</id>
<username>root</username>
<password>***</password>
</server>
另外maven也支持部署到私有maven仓库,在一些公司可能会自己搭建maven私有仓库