Maven是专门为Java项目打造的项目管理和构建工具,类似 NodeJS 的 NPM,PHP 的 composer。
官网:https://maven.apache.org/
它的主要功能有:
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
<project ...>
<modelVersion>4.0.0modelVersion>
<groupId>com.yiqiesuifeng.bloggroupId>
<artifactId>helloartifactId>
<version>1.0version>
<packaging>jarpackaging>
<properties>
...
properties>
<dependencies>
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
<version>1.2version>
dependency>
dependencies>
project>
groupId
:类似于Java的包名,通常是公司或组织名称artifactId
:类似于Java的类名,通常是项目名称version
:项目版本号一个Maven工程就是由groupId
,artifactId
和version
作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。例如,依赖commons-logging
:
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
<version>1.2version>
dependency>
使用
声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
Maven定义了几种依赖关系:
compile
:编译时需要用到该jar包(默认)test
:编译Test时需要用到该jar包runtime
:编译时不需要,但运行时需要用到provided
:编译时需要用到,但运行时由JDK或某个服务器提供使用示例:
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-apiartifactId>
<version>5.3.2version>
<scope>testscope>
dependency>
用户主目录下进入.m2
目录,创建一个settings.xml
配置文件,内容如下:
<settings>
<mirrors>
<mirror>
<id>aliyunid>
<name>aliyunname>
<mirrorOf>centralmirrorOf>
<url>https://maven.aliyun.com/repository/centralurl>
mirror>
mirrors>
settings>
Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。
Maven的生命周期(lifecycle)由一系列阶段(phase)构成
使用mvn
这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。
常用命令:
mvn clean
:清理所有生成的class和jarmvn clean compile
:先清理,再执行到compile
mvn clean test
:先清理,再执行到test
,因为执行test
前必须执行compile
,所以这里不必指定compile
mvn clean package
:先清理,再执行到package
default
它包含以下phase:
运行mvn package
,Maven就会执行default
生命周期,它会从开始一直运行到package
这个phase为止:
运行mvn compile
,Maven也会执行default
生命周期,但这次它只会运行到compile
,即以下几个phase:
clean
它会执行3个phase:
执行一个phase又会触发一个或多个goal
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.0modelVersion>
<groupId>com.practice.xxxgroupId>
<artifactId>buildartifactId>
<version>1.0version>
<packaging>pompackaging>
<name>buildname>
<modules>
<module>parentmodule>
<module>module-amodule>
<module>module-bmodule>
<module>module-cmodule>
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.0modelVersion>
<groupId>com.practice.xxxgroupId>
<artifactId>parentartifactId>
<version>1.0version>
<packaging>pompackaging>
<name>parentname>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<maven.compiler.source>11maven.compiler.source>
<maven.compiler.target>11maven.compiler.target>
<java.version>11java.version>
properties>
<dependencies>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.28version>
dependency>
...
dependencies>
project>
注:parent的
是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.0modelVersion>
<parent>
<groupId>com.practice.xxxgroupId>
<artifactId>parentartifactId>
<version>1.0version>
<relativePath>../parent/pom.xmlrelativePath>
parent>
<artifactId>module-aartifactId>
<packaging>jarpackaging>
<name>module-aname>
project>