跳过正文
  1. 文章/
  2. Java/
  3. JavaEE/
  4. Maven/

1、Maven

·3884 字·8 分钟· loading · loading · ·
Java JavaEE Maven
GradyYoung
作者
GradyYoung
Maven - 点击查看当前系列文章
§ 1、Maven 「 当前文章 」

Maven
#

Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段中插件(plugin)目标的逻辑 。

解决的问题
#

  • 我们需要引用各种jar包,尤其是比较大的工程,引用的jar包往往有几十个乃至上百个,每用到一种jar包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的jar包冲突,版本冲突。
  • 我们写好的java文件,需要通过javac编译成class文件才能交给JVM运行。这项工作可以由各种集成开发工具帮我们完成Eclipse、IDEA等都可以将代码即时编译。
  • 世界上没有不存在bug的代码,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
  • 再优雅的代码也是要被其他人使用的。我们后面还需要把代码与各种配置文件、资源整合到一起,进行打包。如果是web项目,还需要将之发布到服务器。

Maven解决了以上问题,可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站点。

Maven核心功能
#

依赖管理
#

  • 传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。
  • Maven项目中不直接将jar包导入到工程中,而是通过在pom.xml文件中添加所需jar包的坐标。项目运行时,通过读取坐标到一个专门用于存放jar包仓库(Maven仓库)找到相应的jar包。
  • 例如我们有两个项目都需要使用mysql-connector-java-8.0.13.jar,如果没有Maven,我们就需要将这个jar文件copy到两个项目中;使用Maven以后,我们只需要下载这个jar文件到Maven仓库,然后两个项目都可以使用同一份jar依赖。

项目构建
#

指的是项目从编译、测试、打包、安装,部署整个过程都交给maven进行管理,这个过程称为构建。整个过程,maven可以一键执行。

Maven仓库
#

  • 本地仓库
    • 仓库在本地磁盘上,maven通过pom.xml中的依赖坐标,先从本地仓库中寻找,如果没有找到就会从远程仓库中寻找并下载,并且保存在本地仓库中,下次使用就不需要下载了。
  • 远程仓库
    • 中央仓库
      • 由Maven官方团队维护,例如http://repo1.maven.org/maven2,由于国内下载速度很慢,所以我们一般使用阿里仓库
    • 第三方仓库
      • 由公司或其他组织搭建的私服,例如阿里的Maven仓库:https://maven.aliyun.com/repository/central/

安装和配置
#

1、官网下载
#

  • 官网地址:http://maven.apache.org/download.cgi

  • 由于Maven使用Java语言开发,具有跨平台性,所以Maven不区分操作系统

  • 解压后放到无中文,无空格的目录下

  • 目录结构

    • bin:存放了 maven 的命令,比如mvn tomcat7:run

    • boot:存放了一些 maven 本身的引导程序,如类加载器等

    • conf:存放了 maven 的一些配置文件,如setting.xml文件

    • lib:存放了 maven 本身运行所需的一些 jar 包

2、配置环境变量
#

  • 将maven安装目录配置到环境变量MAVEN_HOME

  • 在path中添加%MAVEN_HOME%\bin

  • 注意:Maven的运行依赖于JAVA_HOME

  • 配置完成后,可以使用命令:mvn -v验证

3、配置本地仓库路径
#

maven/conf/settings.xml

<localRepository>E:/Maven/maven-jar</localRepository>

4、配置镜像下载
#

由于默认服务器在国外,所以配置镜像可以提升下载速度

阿里镜像

<mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
    	<!--老地址
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    	-->
    	<!--新地址-->
    	<url>https://maven.aliyun.com/repository/central/</url>
</mirror>

5、初始化仓库
#

mvn help:system

首次执行mvn help:system命令,Maven相关工具自动帮我们到Maven中央仓库下载缺省的或者Maven中央仓库更新的各种配置文件和类库(jar包)到Maven本地仓库中。

下载完各种文件后,mvn help:system命令会打印出所有的Java系统属性和环境变量,这些信息对我们日常的编程工作很有帮助。

Maven工程的目录结构
#

注意:maven工程必须按照约定的目录结构创建

  • src
    • main
      • java:存放java源代码
      • resources:项目资源文件,例如各类配置文件
    • test
      • java:测试程序源码
      • resources:测试资源文件
  • pom.xml:项目对象模型,主要用来描述项目是如何组成的及构建的

常用命令
#

# 查看maven版本
mvn -version   
# 或者使用
mvn -v

# 初始化仓库
mvn help:sysetem

# 清除target目录
mvn clean 

# 编译项目
mvn compile

# 运行测试代码
mvn test

# 项目打包
mvn package

# maven支持组合命令使用,例如先清除target再打包
mvn clean package

# maven可以使用-Dparam=value给插件传参
# 例如可以使用-Dmaven.test.skip=true,给maven-surefire-plugin插件传参,不执行测试用例,也不编译测试用例类
mvn package -Dmaven.test.skip=true

# 发布到本地仓库
mvn install

# 发布到本地仓库及远程仓库
mvn deploy

# 生成站点文档
mvn site

Maven的生命周期
#

Maven内置了三个声明周期:cleandefaultsite,分别对应了三种不同的处理项目的过程。在每个生命周期的过程中都会有很多的阶段(phase),这些阶段按照既定的顺序执行来完成一个项目的构建,由于Maven的声明周期是抽象的,也就是说,阶段本身不具备处理项目的能力。所以各个阶段的工作需要由插件(plugin)来完成,一个插件通常可以完成一个或者多个阶段的工作。每个阶段的工作对应插件中的一个目标(goal)。不同的插件结合起来,就完成了整个项目的构建,一个阶段也可以绑定一个或多个插件目标。

Maven中内置了三套生命周期(依据不同的目的,定义了三种处理项目的过程)

  • clean lifecycle 负责清理项目
  • default lifecycle 负责项目的构建、发布
  • site lifecycle 负责生成项目站点,即API文档信息网站

阶段(phase)
#

每个生命周期由若干不同的**阶段(Phase)**组成。阶段代表了生命周期的特殊步骤。

maven的每个阶段都可以使用mvn phasename来进行命令行调用,但是用连字符(pre-*post-*、或 process-*)命名的阶段通常不会从命令行直接调用。这些阶段对构建进行排序,在构建之外生成没有用处的中间结果。

clean lifecycle
#

clean 生命周期包含以下阶段:

  • pre-clean:在清理之前完成一些所需的工作;
  • clean:删除之前构建出的所有文件;
  • post-clean:在清理之后完成一些所需的工作。

default lifecycle
#

default 生命周期包含了实际构建时需要执行的所有步骤,是最重要的生命周期。该生命周期包含以下阶段:

  • validate:验证项目是否正确,所有必要信息是否可用;
  • initialize:初始化构建状态,例如设置 property 或创建目录;
  • generate-sources:生成要包含在编译中的任何源代码;
  • process-sources:处理源代码,例如替换所有引用的值;
  • generate-resources:生成要包含在包中的资源;
  • process-resources:将资源复制并处理到目标目录中,准备打包;
  • compile:编译项目的源代码;
  • process-classes:对编译生成的文件进行后期处理,例如对 Java 类进行字节码增强;
  • generate-test-sources:生成要包含在编译中的任何测试源代码;
  • process-test-sources:处理测试源代码,例如替换所有引用的值;
  • generate-test-resources:为测试创建资源;
  • process-test-resources:将资源复制并处理到测试目标目录中;
  • test-compile:将测试源代码编译到测试目标目录中;
  • process-test-classes:对测试编译生成的文件进行后期处理,例如对 Java 类进行字节码增强;
  • test:使用合适的单元测试框架运行测试。这些测试不应要求打包或部署代码;
  • prepare-package:在实际打包之前,执行准备打包所需的任何操作。这通常会生成已处理但尚未打包的所有文件和目录;
  • package:获取编译后的代码,并将其打包为可分发的格式,如 JAR;
  • pre-integration-test:在执行集成测试之前执行所需的操作。这可能涉及一些事项,如设置所需环境等;
  • integration-test:如有必要,处理包并将其部署到可以运行集成测试的环境中;
  • post-integration-test:执行集成测试后执行所需的操作。这可能包括清理环境;
  • verify:运行任何检查以验证包是否有效并符合质量标准;
  • install:将包安装到本地仓库中,作为本地其他项目中的依赖项使用;
  • deploy:在集成或发布环境中完成,将最终包复制到远程仓库,以便与其他开发人员和项目共享。

常用的maven命令,在执行的时候,其实也就是执行了一部分阶段,例如

  • mvn compile:执行从validatecompile阶段,完成编译主源代码编译
  • mvn package:执行从validatepackage阶段,完成打包
  • mvn install:执行从validateinstall阶段,完成包安装到本地仓库
  • mvn deploy:执行从validatedeploy阶段,完成包部署到中心库中

site lifecycle
#

  • pre-site:在生成实际的项目站点之前执行所需的流程;
  • site:生成项目的站点文档;
  • post-site:执行完成站点生成所需的流程;
  • site-deploy:将生成的站点文档部署到指定的 web 服务器。

IDE集成Maven
#

Idea
#

说明: clipboard.png

Eclipse
#

说明: clipboard.png

说明: clipboard.png

说明: clipboard.png

Maven - 点击查看当前系列文章
§ 1、Maven 「 当前文章 」