资料

  1. 廖雪峰Maven基础
  2. 菜鸟教材Maven教程
  3. Maven教程之入门指南

学习目标

  1. 知道Maven是什么。
  2. 知道Maven怎么安装。
  3. 知道Maven怎么使用。

基础知识

Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具

Maven安装

1.下载Maven:传送门

maven项目 java 类 java的maven_java


2. 将下载好的zip文件拷贝到指定目录并解压

3. 配置环境变量

新建系统变量 MAVEN_HOME

maven项目 java 类 java的maven_xml_02


编辑系统变量 Path,添加变量值:;%MAVEN_HOME%\bin

maven项目 java 类 java的maven_xml_03


检测是否按照成功,打开cmd命令,输入mvn -v

maven项目 java 类 java的maven_java_04

Maven标准工程结构

一个使用Maven管理的普通的Java项目,它的目录结构默认如下:

a-maven-project
|-- pom.xml(maven的核心配置文件)
|-- src
|-- main
  |-- java(java源代码目录)
  |-- resources(资源文件目录)
|-- test
    |-- java(单元测试代码目录)
|-- target(输出目录,所有的输出物都存放在这个目录下)
    |-- classes(编译后的class文件存放处)

我们再来看最关键的一个项目描述文件pom.xml,它的内容长得像下面:

<project ...>
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.itranswarp.learnjava</groupId>
	<artifactId>hello</artifactId>
	<version>1.0</version>
	<packaging>jar</packaging>
	<properties>
        ...
	</properties>
	<dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
	</dependencies>
</project>

通常是项目名称,再加上version,一个Maven工程就是由groupId,artifactId和version作为唯一标识.。

  • project工程的标签
  • modelVersion 模型版本需要设置为 4.0。
  • groupId类似于Java的包名,通常是公司或组织名称
  • artifactId类似于Java的类名
  • version版本号
  • dependencies:依赖的包

Maven是一个Java项目的管理和构建工具:

  • Maven使用pom.xml定义项目内容,并使用预设的目录结构;
  • 在Maven中声明一个依赖项可以自动下载并导入classpath;
  • Maven使用groupIdartifactIdversion唯一定位一个依赖。

Maven快速入门

Idea使用Maven创建项目

  1. 依次点击 File -> New -> Project 打开创建工程对话框,选择 Maven 工程
  2. 输入项目信息

Eclipse使用Maven创建项目

待补充

Maven依赖关系

Maven定义了几种依赖关系,分别是compiletestruntimeprovided

scope

说明

示例

compile

编译时需要用到该jar包(默认)

commons-logging

test

编译Test时需要用到该jar包

junit

runtime

编译时不需要,但运行时需要用到

mysql

provided

编译时需要用到,但运行时由JDK或某个服务器提供

servlet-api

Maven镜像

除了可以从Maven的中央仓库下载外,还可以从Maven的镜像仓库下载。如果访问Maven的中央仓库非常慢,我们可以选择一个速度较快的Maven的镜像仓库。Maven镜像仓库定期从中央仓库同步:

maven项目 java 类 java的maven_maven项目 java 类_05


中国区用户可以使用阿里云提供的Maven镜像仓库。使用Maven镜像仓库需要一个配置,在用户主目录下进入.m2目录(如:C:\Users\Administrator\.m2),创建一个settings.xml配置文件,内容如下:

<settings>
    <mirrors>
        <mirror>
            <id>aliyun</id>
            <name>aliyun</name>
            <mirrorOf>central</mirrorOf>
            <!-- 国内推荐阿里云的Maven镜像 -->
            <url>https://maven.aliyun.com/repository/central</url>
        </mirror>
    </mirrors>
</settings>

使用第三方组件(包)

方法是通过search.maven.orghttp://mvnrepository.com/搜索关键字,找到对应的组件后,直接复制下图的内容到pom.xml中

maven项目 java 类 java的maven_maven项目 java 类_06


在命令中,进入到pom.xml所在目录,输入以下命令:

mvn clean package

在IDE中使用Maven

  1. Eclipse
    几乎所有的IDE都内置了对Maven的支持。在Eclipse中,可以直接创建或导入Maven项目。如果导入后的Maven项目有错误,可以尝试选择项目后点击右键,选择Maven - Update Project…更新:
  2. Idea

构建流程

一个典型的 Maven 构建(build)生命周期是由以下几个阶段(phase)的序列组成的:

maven项目 java 类 java的maven_java_07


我们使用mvn这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。在实际开发过程中,经常使用的命令有:

  • mvn clean:清理所有生成的class和jar;
  • mvn clean compile:先清理,再执行到compile;
  • mvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile;
  • mvn clean package:先清理,再执行到package。

Maven通过lifecycle(生命周期)、phase(阶段)和goal(最小任务单元)来提供标准的构建流程。lifecycle、phase和goal的关系:

  • lifecycle相当于Java的package,它包含一个或多个phase;
  • phase相当于Java的class,它包含一个或多个goal;
  • goal相当于class的method,它其实才是真正干活的。

在Idea中可以直接使用这些命令

maven项目 java 类 java的maven_java_08

使用插件

Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告

插件通常提供了一个目标的集合,并且可以使用下面的语法执行:

mvn [plugin-name]:[goal-name]

插件下载地址:https://maven.apache.org/plugins/

模块管理

原始工程结构

mutiple-project
├── module-a
│   ├── pom.xml
│   └── src
├── module-b
│   ├── pom.xml
│   └── src
└── module-c
    ├── pom.xml
    └── src

改进后的工程结构:

multiple-project
├── pom.xml
├── parent
│   └── pom.xml
├── module-a
│   ├── pom.xml
│   └── src
├── module-b
│   ├── pom.xml
│   └── src
└── module-c
    ├── pom.xml
    └── src

将module-a和module-b两个模块共有的包放到parent文件夹下的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.0</modelVersion>

    <groupId>com.itranswarp.learnjava</groupId>
    <artifactId>parent</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>

    <name>parent</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.28</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

模块A就可以简化为:(引用父配置)

<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>

    <parent>
        <groupId>com.itranswarp.learnjava</groupId>
        <artifactId>parent</artifactId>
        <version>1.0</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>

    <artifactId>module-a</artifactId>
    <packaging>jar</packaging>
    <name>module-a</name>
</project>

如果模块A依赖模块B,则模块A需要模块B的jar包才能正常编译,我们需要在模块A中引入模块B:

<dependencies>
        <dependency>
            <groupId>com.itranswarp.learnjava</groupId>
            <artifactId>module-b</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

在编译的时候,需要在根目录创建一个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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.itranswarp.learnjava</groupId>
    <artifactId>build</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    <name>build</name>

    <modules>
        <module>parent</module>
        <module>module-a</module>
        <module>module-b</module>
        <module>module-c</module>
    </modules>
</project>

Maven支持模块化管理,可以把一个大项目拆成几个模块:

  • 可以通过继承在parent的pom.xml统一定义重复配置;
  • 可以通过编译多个模块。

mvnw

mvnw是Maven Wrapper的缩写,默认情况下,系统所有项目都会使用全局安装的这个Maven版本。但是,对于某些项目来说,它可能必须使用某个特定的Maven版本,这个时候,就可以使用Maven Wrapper,它可以负责给这个特定的项目安装指定版本的Maven,而其他项目不受影响。
简单说,Maven Wrapper就是给一个项目提供一个独立的,指定版本的Maven给它使用。

安装mvnw

如果要指定使用的Maven版本,使用下面的安装命令指定版本,例如3.3.3:

mvn -N io.takari:maven:0.7.6:wrapper -Dmaven=3.3.3

安装后,查看项目结构:

my-project
├── .mvn
│   └── wrapper
│       ├── MavenWrapperDownloader.java
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   └── resources
    └── test
        ├── java
        └── resources

使用mnvw

mvnw clean package

发布Artifact

待补充