1 2 3 4

Maven 快速入门

官网:https://maven.apache.org/index.html
POM 参考文档: https://maven.apache.org/pom.html
Settings 参考文档: https://maven.apache.org/settings.html

一、简介

Maven 是一个用于构建/管理任何基于Java项目的工具,其本身也是基于Java的 因此需要Java环境。其最初是为了简化 Jakarta Turbine 项目的构建而生。

其主要处理以下关心的领域:

  1. 使构建过程更简单:使用 Maven 并不能消除对底层机制的了解需要,但仍能使开发者规避很多细节。
  2. 提供统一的构建系统:Maven 使用 POM(project object model,项目对象模型)和插件集构建项目。一旦你熟悉一个 Maven 项目,则会知道所有 Maven 项目的构建。
  3. 提供高质量的项目信息:Maven 提供了有用的项目信息,一部分来自 POM,一部分生成自源码。(注:这部分不会太常用到,属于 reporting 模块,即通过调用 "mvn site",运行一个 Server,在网页上展示项目相关信息报告,如图所示。详情可参考: Apache Maven Site Plugin, Configuring Reports
  4. 提供最佳的项目开发指导:Maven 意在收集当前最佳实践开发原则,并使其变得更简单以指导项目方向。
    例如:
    • 目前单元测试这一最佳实践作为了指导,单元测试的规范、执行、报告在 Maven 中作为了通常构建声明周期的一部分。
    • Maven 还协助项目工作流(workflow),例如发布(release)和问题管理(issue management)。
    • Maven 在项目目录结构的布局上也给出了一些指导建议,一旦你熟悉了这布局,可以很容易游览其他Maven项目。
      Maven 在项目布局上较为坚持,虽然 Maven 设计为了灵活适应不同项目的需要,但它不可能在不影响目标的情况下满足每一种不寻常结构的项目。因此若不能被重新组织,可能不得不放弃一些特性或Maven使用。

二、安装

  1. 系统要求:
    • Maven 3.3+ 需要 JDK1.7
    • JAVA_HOME 环境变量确保指向了JDK目录
  2. 下载/安装:
    2.1 Maven 官方提供现成 binary 分发: https://maven.apache.org/download.cgi
    2.2 解压后将 bin 目录添加进 PATH 即可
    image

三、简单使用

  1. 利用原型(Archetype)生成简易项目结构:
    1.1 在 PowerShell中执行:mvn archetype:generate "-DgroupId=com.mycompany.app" "-DartifactId=my-app" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DarchetypeVersion=1.4" "-DinteractiveMode=false"
    1.2 修改"pom.xml"添加以下内容,声明 Java源码版本信息
    <properties>
    	<maven.compiler.source>11</maven.compiler.source>
    	<maven.compiler.target>11</maven.compiler.target>
    </properties>
    
  2. 进入目录,并打包成 jar
    cd maven-sample
    mvn package  //mvn会自动下载打包所需组件
    
  3. 执行测试
    java -cp .\target\maven-sample-1.0-SNAPSHOT.jar top.simpleito.demo.App

四、主要模块/知识

1. 标准目录布局(Standard Directory Layout)

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
注:

  • 标准目录布局同时也是用 Maven 构建的默认值,比如哪里是java源码,测试目录在哪,输出目录是什么等等。
  • 以下有些描述暂时觉得模糊也没关系,一些部分并不常见 笔者也没用过,像 it / filters / site / assembly等,临时有大致概念即可。
  • 从官方示例看,java 源码包结构只要求和 groupId 相同即可,而不要求加一层 artifectId 的父包。但实际项目各种都有
maven-project
    ├───pom.xml  项目描述文件,定义在生命周期中所需的依赖和所需模块等等
    ├───README.txt  项目说明
    ├───NOTICE.txt  项目中使用第三方库的资料
    ├───LICENSE.txt  许可文件
    └───src  包含构建项目所需所有资料,site等等
        ├───main  最重要的目录,所有工件(artifect)都应出现在这里
        │   ├───java  工件Java源码
        │   ├───resources  配置及资源等文件
        │   ├───filters  包含在构建阶段将值注入到resources目录下配置属性的文件
        │   └───webapp  对于web应用,包含诸如JS/CSS/HTML等资源文件
        ├───test  所有测试代码及资源
        │   ├───java
        │   ├───resources
        │   └───filters
        ├───it  通常是用于 Maven Failsafe Plugin 的集成测试
        ├───site  使用 Maven Site Plugin(https://maven.apache.org/plugins/maven-site-plugin/index.html) 创建的site文档
        └───assembly  二进制打包装配配置,一般也不常用适用 Apache Maven Assembly Plugin
    └───target  用于容纳 build 的所有输出

2. POM(Project Object Model,项目对象模型)

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html
POM 是 Maven 中的基本工作单元,它是一个 XML 文件,包含了"项目有关信息"和"配置Maven构建项目的细节"。
当执行一个任务时,Maven 会在当前目录寻找 POM 文件,从而读取所需的配置信息。
POM 中可以指定许多信息,包括:

  • 依赖(dependencies)、插件(plugins) 或 可被执行的目标(goal)、构建配置(profiles)等。
  • 以及关于项目的本身的信息,如 版本(version)、说明(description)、开发人员(developers)等

需注意的是:POM 中的<groupid>:<artifactId>:<version>构成了该工件的完全限定名
关于 POM、Super POM、最小POM等更多信息参考:Maven POM 详解

3. Settings(Maven本身设置)

https://maven.apache.org/settings.html
settings.xml 包含对 Maven 自身的配置,不应绑定到任何特定项目分发给用户。主要包含:本地储存库,代理,身份验证信息等等。

该配置文件可能存在两个位置:

  • 全局的设置:${maven.home}/conf/settings.xml
  • 用户级设置:${user.home}/.m2/settings.xml 【默认情况下可能不存在,可copy全局过来修改】

若都存在,则内容将被合并作用。优先级:用户级 > 全局
配置详情参考:Maven Settings

4.Build Lifecycle(构建生命周期)

https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
Maven 基于生命周期的概念,意味着构建(build)和分发(distributing)特定工件的过程得以清晰定义,意味着只需学习一小组命令,即可构建任何 Maven 项目。

有三种内置构建生命周期(build lifecycle):默认(default)、清理(clean)、site
需注意:

  1. 构建生命周期由构建阶段(build phases)组成,每个阶段都是生命周期中的一个步骤(stage),
  2. Maven 命令格式:mvn [options] [<goal(s)>] [<phase(s)>],可按需执行某个 phase
  3. build phase 将按顺序执行,例如若执行 mvn install,将会执行在此之前的所有 phase
  4. build phase 又是由声明插件所引入的插件目标(plugin goals)组成的。
    一个 plugin goal 代表一个特定的任务(比phase更精细),它可能被绑定到零个或多各 build phase,不绑定的 plugin goal 可在 build lifecycle 之外直接自行执行

以 default 声明周期为例,主要包含以下 phase:完整的请参考 Lifecycle Reference

  • validate:验证项目是否正确,所有必要信息是否提供
  • compile:编译项目源码
  • test:使用合适的单元测试框架测试编译后的源码。这些测试代码不要求被打包或部署
  • package:将编译后的代码打包为分发格式,例如 JAR
  • verify:运行继承测试的所有检查,以确保符合标准
  • install:将 package 安装到 Locale Repository(本地仓储),用作其他项目依赖
  • deploy:将最终 package 复制到 Remote Repository(远程仓储)

附/参考:

posted @ 2021-08-09 17:19  SimpleIto  阅读(435)  评论(0编辑  收藏  举报