Maven 是一个项目管理和综合工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven 提供了开发人员的方式来管理:
概括地说,Maven 简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven 增加可重用性并负责建立相关的任务。
想要安装 Apache Maven 在 Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量。
注意:请尽量使用 JDK 1.8 及以上版本
确保已安装 JDK,并设置 JAVA_HOME 环境变量到 Windows 环境变量。
下载地址:http://maven.apache.org/download.cgi
下载 Maven 的 zip 文件,例如: apache-maven-3.5.2-bin.zip,将它解压到你要安装 Maven 的文件夹。假设你解压缩到文件夹 – D:\apache-maven-3.5.2
注意:在这一步,只是文件夹和文件,安装不是必需的。
添加 MAVEN_HOME 环境变量到 Windows 环境变量,并将其指向你的 Maven 文件夹。
使用命令:mvn -version
输出:
C:\Users\Lusifer>mvn -version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)
Maven home: D:\apache-maven-3.5.2\bin\..
Java version: 1.8.0_152, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_152\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Maven 的本地资源库是用来存储所有项目的依赖关系(插件 Jar 和其他文件,这些文件被 Maven 下载)到本地文件夹。很简单,当你建立一个 Maven 项目,所有相关文件将被存储在你的 Maven 本地仓库。
默认情况下,Maven 的本地资源库默认为 .m2 目录文件夹:
~/.m2
C:\Documents and Settings\{your-username}\.m2
通常情况下,可改变默认的 .m2
目录下的默认本地存储库文件夹到其他更有意义的名称,例如, maven-repo 找到 {M2_HOME}\conf\setting.xml
, 更新 localRepository
到其它名称。
执行之后,新的 Maven 本地存储库现在改为 D:/apache-maven-3.5.2/repo
当你建立一个 Maven 的项目,Maven 会检查你的pom.xml
文件,以确定哪些依赖下载。首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默认的 Maven 中央存储库 http://repo1.maven.org/maven2/ 查找下载。
使用 MVNrepository 搜索:https://mvnrepository.com/
在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级。让我们看一个案例研究,以了解它是如何工作的。假设你想使用 Log4j 作为项目的日志。这里你要做什么?
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>]
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
dependencies>
当 Maven 编译或构建,log4j 的 jar 会自动下载,并把它放到 Maven 本地存储库
所有由 Maven 管理
看看有什么不同?那么到底在 Maven 发生了什么?当建立一个 Maven 的项目,pom.xml 文件将被解析,如果看到 log4j 的 Maven 坐标,然后 Maven 按此顺序搜索 log4j 库:
POM 代表项目对象模型。它是 Maven 中工作的基本单位,这是一个 XML 文件。它始终保存在该项目基本目录中的 pom.xml 文件。
POM 包含的项目是使用 Maven 来构建的,它用来包含各种配置信息。
POM 也包含了目标和插件。在执行任务或目标时,Maven 会使用当前目录中的 POM。它读取POM得到所需要的配置信息,然后执行目标。部分的配置可以在 POM 使用如下:
groupId
),它的名字(artifactId
)和版本(version
),因为这些属性在项目仓库是唯一标识的。<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.0modelVersion>
<groupId>com.lusifergroupId>
<artifactId>projectartifactId>
<version>1.0version>
<project>
要注意的是,每个项目只有一个 POM 文件
节点 | 描述 |
---|---|
groupId | 这是项目组的编号,这在组织或项目中通常是独一无二的。 例如,一家银行集团com.company.bank 拥有所有银行相关项目。 |
artifactId | 这是项目的 ID。这通常是项目的名称。 例如,consumer-banking 。 除了 groupId 之外,artifactId 还定义了 artifact 在存储库中的位置。 |
version | 这是项目的版本。与 groupId 一起使用,artifact 在存储库中用于将版本彼此分离。 例如:com.company.bank:consumer-banking:1.0 ,com.company.bank:consumer-banking:1.1 |
版本号 | 说明 |
---|---|
1.0.0 | 第一个版本,有5个功能 |
1.0.1 | 第一个版本,修复了1个bug |
1.1.0 | 第一个版本,新加了一个功能 |
2.0.0 | 第二个版本,项目结构有了变化 |
Maven 是一个执行插件的框架,每一个任务实际上是由插件完成的。Maven 插件通常用于:
mvn [plugin-name]:[goal-name]
例如,一个 Java 项目可以使用 Maven 编译器插件来编译目标,通过运行以下命令编译
mvn compiler:compile
Maven 提供以下两种类型插件:
类型 | 描述 |
---|---|
构建插件 | 在生成过程中执行,并在 pom.xml 中的 元素进行配置 |
报告插件 | 在网站生成期间执行,在 pom.xml 中的,元素进行配置 |
以下是一些常见的插件列表:
插件 | 描述 |
---|---|
clean |
编译后的清理目标,删除目标目录 |
compiler |
编译 Java 源文件 |
surefile |
运行JUnit单元测试,创建测试报告 |
jar |
从当前项目构建 JAR 文件 |
war |
从当前项目构建 WAR 文件 |
javadoc |
产生用于该项目的 Javadoc |
antrun |
从构建所述的任何阶段运行一组 Ant 任务 |
大型应用软件一般由多个模块组成,一般它是多个团队开发同一个应用程序的不同模块,这是比较常见的场景。例如,一个团队正在对应用程序的应用程序,用户界面项目(app-ui.jar:1.0
) 的前端进行开发,他们使用的是数据服务工程 (data-service.jar:1.0
)。
现在,它可能会有这样的情况发生,工作在数据服务团队开发人员快速地开发 bug 修复或增强功能,他们几乎每隔一天就要释放出库到远程仓库。
现在,如果数据服务团队上传新版本后,会出现下面的问题:
快照(SNAPSHOT)是一个特殊版本,指出目前开发拷贝。不同于常规版本,Maven 每生成一个远程存储库都会检查新的快照版本。
现在,数据服务团队将在每次发布代码后更新快照存储库为:data-service:1.0-SNAPSHOT
替换旧的 SNAPSHOT jar。
在使用版本时,如果 Maven 下载所提到的版本为data-service:1.0
,那么它永远不会尝试在库中下载已经更新的版本 1.0。要下载更新的代码,data-service 的版本必须要升级到 1.1。
在使用快照(SNAPSHOT)时,Maven 会在每次应用程序 UI 团队建立自己的项目时自动获取最新的快照(data-service:1.0-SNAPSHOT
)。
mvn clean
mvn compile
mvn package
mvn -d maven.test.skip=true
mvn install
mvn source:jar
或
mvn source:jar-no-fork
下面我们来学习如何使用 Maven 创建一个 Java Web 应用程序
选择File
-> New
-> Project...
选择Maven
项目
填写项目信息
Java Web 的 Maven 基本结构如下:
├─src
│ ├─main
│ │ ├─java
│ │ ├─resources
│ │ └─webapp
│ │ └─WEB-INF
│ └─test
│ └─java
结构说明:
src
:源码目录
src/main/java
:Java 源码目录src/main/resources
:资源文件目录src/main/webapp
:Web 相关目录src/test
:单元测试在 IDEA 界面的右侧 Maven Projects
选项,可以管理 Maven 项目的整个生命周期、插件、依赖等
修改 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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.funtlgroupId>
<artifactId>hello-mavenartifactId>
<version>1.0.0-SNAPSHOTversion>
<packaging>warpackaging>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>log4j-over-slf4jartifactId>
<version>1.7.25version>
dependency>
dependencies>
project>
配置说明:
packaging
:打包方式,这里是war
包,表示为 Java Web 应用程序dependencies
:项目依赖配置,整个项目生命周期中所需的依赖都在这里配置创建一个Servlet
用于测试请求
package com.funtl.hello.maven.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
创建一个JSP
页面,用于测试请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
Hello Maven
body>
html>
在 src/main/resources
目录下创建log4j.properties
配置文件,内容如下:
log4j.rootLogger=INFO, console, file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=logs/log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n
web.xml 配置文件如下:
HelloServlet
com.funtl.hello.maven.servlet.HelloServlet
HelloServlet
/servlet/hello
按照之前章节 第一个 IDEA 应用程序 配置完 Tomcat 后直接运行,打开浏览器访问 http://localhost:8080 显示如下:
Hello Maven