Maven是专门为Java项目打造的项目管理和构建工具,类似 NodeJS 的 NPM,PHP 的 composer。

官网:https://maven.apache.org/

它的主要功能有:

  • 提供了一套标准化的项目结构;
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……);
  • 提供了一套依赖管理机制。

安装配置

MasOS

1、下载 apache-maven-x.x.x-bin.tar.gz 压缩包

2、解压到自定义目录,如:/usr/local

3、配置环境变量

# 或者 ~/.bash_profile,根据自己使用终端决定
$ vim ~/.zshrc

# 添加环境变量(根据自己的目录进行修改)
export M2_HOME=/usr/local/apache-maven-3.9.1
export PATH=${PATH}:${M2_HOME}/bin

# 生效
$ source ~/.zshrc

4、查看是否安装成功

$ mvn -v

Apache Maven 3.9.1 (2e178502fcdbffc201671fb2537d0cb4b4cc58f8)
Maven home: /usr/local/apache-maven-3.9.1
Java version: 19.0.1, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "13.3", arch: "aarch64", family: "mac"

目录结构

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

./maven-project
├── pom.xml                // 项目描述文件
├── src
│   ├── main
│   │   ├── java        // 存放Java源码
│   │   └── resources    // 存放资源文件
│   └── test            // 单元测试
│       ├── java        // 单测源码
│       └── resources    // 单测资源
└── target

pom.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yiqiesuifeng.blog</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>
  • groupId:类似于Java的包名,通常是公司或组织名称
  • artifactId:类似于Java的类名,通常是项目名称
  • version:项目版本号

一个Maven工程就是由groupIdartifactIdversion作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。例如,依赖commons-logging

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

使用<dependency>声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。

依赖管理

Maven定义了几种依赖关系:

  • compile:编译时需要用到该jar包(默认)
  • test:编译Test时需要用到该jar包
  • runtime:编译时不需要,但运行时需要用到
  • provided:编译时需要用到,但运行时由JDK或某个服务器提供

使用示例:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
</dependency>

镜像管理

切换镜像

用户主目录下进入.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>

构建流程

Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。

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

Lifecycle和Phase

Maven的生命周期(lifecycle)由一系列阶段(phase)构成

使用mvn这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。

常用命令:

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

它包含以下phase:

  • validate
  • initialize
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources
  • compile
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources
  • test-compile
  • process-test-classes
  • test
  • prepare-package
  • package
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install
  • deploy

运行mvn package,Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止:

  • validate
  • ...
  • package

运行mvn compile,Maven也会执行default生命周期,但这次它只会运行到compile,即以下几个phase:

  • validate
  • ...
  • compile
生命周期clean

它会执行3个phase:

  • pre-clean
  • clean (注意这个clean不是lifecycle而是phase)
  • post-clean

Goal

执行一个phase又会触发一个或多个goal

  • compile:compiler:compile
  • test:

    • compiler:testCompile
    • surefire:test

goal的命名总是abc:xyz这种形式

模块管理

一个Maven大项目:

single-project
├── pom.xml
└── src

拆分成3个模块:

mutiple-project
├── pom.xml
├── parent
│   └── pom.xml        // 父级公共配置
├── module-a
│   ├── pom.xml
│   └── src
├── module-b
│   ├── pom.xml
│   └── src
└── module-c
    ├── pom.xml
    └── src

每个模块下面都有独立的 pom 配置,可以抽取pom公共配置作为父级配置,模块下面的pom配置基础父级配置

根目录下的 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.practice.xxx</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>

父级 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.practice.xxx</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>
        ...
    </dependencies>
</project>

注:parent的<packaging>pom而不是jar,因为parent本身不含任何Java代码

module-a 的 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>

    <parent>
        <groupId>com.practice.xxx</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>

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

15 条评论

  1. ngzemjwtrd
    ngzemjwtrd

    交叉点

  2. zcuusgrlau
    zcuusgrlau

    地狱来的战尸

  3. xjmkrwacqy
    xjmkrwacqy

    惊天追踪

  4. qyjhsjkfbp
    qyjhsjkfbp

    一纸婚约

  5. qhalubamsv
    qhalubamsv

    君主制的未来

  6. auihotrjcj
    auihotrjcj

    作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。

  7. crxpzxorpn
    crxpzxorpn

    对趋势的预判具有战略参考价值。

  8. ugwxfkphpb
    ugwxfkphpb

    故事线完整,伏笔巧妙,结局耐人寻味。

  9. elsrlxoirn
    elsrlxoirn

    作者对主题的挖掘深入骨髓,展现了非凡的洞察力和理解力。

  10. gaoditldlf
    gaoditldlf

    哈哈哈,写的太好了https://www.lawjida.com/

  11. smnnmxjvho
    smnnmxjvho

    你的文章充满了创意,真是让人惊喜。 https://www.4006400989.com/qyvideo/87897.html

  12. kkzymxwwji
    kkzymxwwji

    你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/AruG4E0H3O.html

  13. lrarteykge
    lrarteykge

    想想你的文章写的特别好www.jiwenlaw.com

  14. lwywryyslo
    lwywryyslo

    不错不错,我喜欢看 https://www.ea55.com/

  15. muzhgefssn
    muzhgefssn

    不错不错,我喜欢看 https://www.237fa.com/

添加新评论