Maven使用教程
文章目录
- Maven使用教程
- 1.安装Maven
- 2.Maven项目结构
- 3.理解`pom.xml`文件
- 4.详解依赖的属性
- 4.1 依赖范围
- 4.2 依赖可选
- 4.3 依赖排除
- 5.Maven仓库
- 5.1 自定义本地仓库地址
- 5.2 Maven镜像设置
- 5.3 搜索第三方组件
- 6.Maven常见命令
- 7.Maven常用POM属性
- 8.在IDEA中配置Maven
- 9.mvnw
- 10.`pom.xml`文件示例
- 参考
Maven使用教程
Maven 是一个项目管理与构建自动化工具。它的主要功能有:
- 依赖管理:Maven 能帮助我们解决软件包依赖的管理问题,不再需要提交大量的 jar 包、引入第三方库;
- 规范目录结构:Maven 标准的目录结构有助于项目构建的标准化,通过配置 profile 还可以根据不同的环境(开发环境、测试环境,生产环境)读取不同的配置文件;
- 方便集成:能够集成在 IDE 中更方便使用。
1.安装Maven
-
进入官网 Downloading Apache Maven 下载 Maven 压缩包,并解压。
-
设置环境变量。
-
在「环境变量」->「系统变量」->「新建」,创建
M2_HOME
变量。 -
在「环境变量」->「系统变量」->「path」->「编辑」->「新建」,粘贴
%M2_HOME%\bin
。
-
-
打开命令行窗口,输入
mvn -version
,如果看到 Maven 的版本信息,则表示配置成功。
2.Maven项目结构
一个使用 Maven 管理的普通的 Java 项目,它的目录结构默认如下:
a-maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
└── target
项目的根目录a-maven-project
是项目名,它有一个项目描述文件pom.xml
,存放Java源码的目录是src/main/java
,存放资源文件的目录是src/main/resources
,存放测试源码的目录是src/test/java
,存放测试资源的目录是src/test/resources
,最后,所有编译、打包生成的文件都放在target
目录里。这些就是一个Maven项目的标准目录结构。
note:所有的目录结构都是约定好的标准结构,千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven就可以正常使用。
3.理解pom.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId><artifactId>MavenDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>MavenDemo</name>
</project>
- 第一行是
XML
头,指定了该 xml 文档的版本和编码方式。 project
是根元素,声明了一些POM
相关的命名空间及xsd
元素。modelVersion
指定了当前POM
的版本,对于Maven 3
来说,值只能是4.0.0
。groupId
定义了项目属于哪个组织,通常是公司或组织名称。artifactId
定义了项目在组织中的唯一ID,类似于Java的类名,通常是项目名称。version
指定了项目当前的版本,SNAPSHOT
意为快照,说明该项目还处于开发中。name
声明了一个对于用户更为友好的项目名称。
一个 Maven 工程就是由 groupId
,artifactId
和 version
作为唯一标识。在引用其他第三方库的时候,也是通过这 3 个变量确定。例如,依赖 redis.clients
:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>8.0.0</version>
</dependency>
使用<dependency>
声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。
另外,<properties>
定义了一些属性,常用的属性有:
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><maven.compiler.release>8</maven.compiler.release><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
project.build.sourceEncoding
:表示项目源码的字符编码,通常应设定为UTF-8
;maven.compiler.release
:表示使用的JDK版本,例如21
;maven.compiler.source
:表示Java编译器读取的源码版本;maven.compiler.target
:表示Java编译器编译的Class版本。
通过 <properties>
定义的属性,就可以固定JDK版本,防止同一个项目的不同的开发者各自使用不同版本的JDK。
4.详解依赖的属性
<project>
...
<dependencies><dependency><groupId>实际项目</groupId><artifactId>模块</artifactId><version>版本</version><type>依赖类型</type><scope>依赖范围</scope><optional>依赖是否可选</optional><!—主要用于排除传递性依赖--><exclusions><exclusion><groupId>…</groupId><artifactId>…</artifactId></exclusion></exclusions></dependency>
<dependencies>
...
</project>
dependencies
可以包含一个或者多个dependency
元素,以声明一个或者多个项目依赖。grounpId、artifactId和version
组成了依赖的基本坐标。type
指定了依赖的类型,默认为jar
。scope
指定了依赖的范围。optional
标记了依赖是否是可选的。exclusions
用来排除传递性依赖。
4.1 依赖范围
Maven定义了几种依赖关系,分别是compile
、test
、runtime
和provided
:
scope | 说明 | 示例 |
---|---|---|
compile | 编译时需要用到该jar包(默认) | commons-logging |
test | 编译Test时需要用到该jar包 | junit |
runtime | 编译时不需要,但运行时需要用到 | mysql |
provided | 编译时需要用到,但运行时由JDK或某个服务器提供 | servlet-api |
-
默认的
compile
是最常用的,Maven会把这种类型的依赖直接放入classpath。 -
test
依赖表示仅在测试时使用,正常运行时并不需要。最常用的test
依赖就是 JUnit:<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.2</version><scope>test</scope> </dependency>
-
runtime
依赖表示编译时不需要,但运行时需要。最典型的runtime
依赖是 JDBC 驱动,例如MySQL驱动:<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version><scope>runtime</scope> </dependency>
-
provided
依赖表示编译时需要,但运行时不需要。最典型的provided
依赖是 Servlet API ,编译的时候需要,但是运行时,Servlet服务器内置了相关的jar,所以运行期不需要:<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>4.0.0</version><scope>provided</scope> </dependency>
4.2 依赖可选
传递性依赖:当一个项目(模块、库等)依赖于另一个项目,而被依赖的项目又依赖于其他项目时,这些间接的依赖关系就被称为传递性依赖。也就是说,若项目 A 依赖项目 B,项目 B 又依赖项目 C,那么项目 C 就是项目 A 的传递性依赖。
项目中 A 依赖 B,B 依赖于 X 和 Y,如果所有这三个的范围都是 compile 的话,那么 X 和 Y 就是 A 的 compile 范围的传递性依赖,但是如果想 X、Y 不作为 A 的传递性依赖,不给它用的话,可以按照下面的方式配置可选依赖:
<project> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId><artifactId>Learn</artifactId><version>1.0-SNAPSHOT</version><dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.10</version> <optional>true</optional> </dependency> <dependency> <groupId>postgresql</groupId> <artifactId>postgresql</groupId> <version>8.4-701.jdbc3</version> <optional>true</optional> </dependency> </dependencies>
</project>
4.3 依赖排除
有时候引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到依赖排除了,比如 spring-boot-starter-web 自带了 logback 这个日志包,我们想引入 log4j2 的,所以先排除掉 logback 的依赖包,再引入想要的包就可以了。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.6</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
<!-- 使用 log4j2 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>2.5.6</version>
</dependency>
5.Maven仓库
- 本地仓库:是 Maven 在本地计算机上存储构件的地方。当 Maven 从远程仓库下载构件时,会先将其存储在本地仓库,以便下次使用时直接从本地获取,加快构建速度。默认情况下,本地仓库位于用户目录下的
.m2/repository
目录中。 - 远程仓库:位于网络上的服务器,用于存储各种构件。当本地仓库中没有所需的构件时,Maven 会从远程仓库下载。远程仓库可以分为以下几种:
- 中央仓库:由 Maven 社区维护的公共仓库,包含了大量的流行开源项目的构件。Maven 默认会从中央仓库下载构件,其地址是 https://repo.maven.apache.org/maven2/。
- 私服:是在企业内部搭建的私有 Maven 仓库。它可以代理远程仓库,缓存常用的构件,减少对外部网络的依赖,提高构建速度,同时也可以用于存储企业内部的私有构件。
- 第三方仓库:除了中央仓库和私服之外的其他远程仓库。一些开源项目可能会有自己的独立仓库,或者企业可能会使用一些特定的商业仓库,这些都属于第三方仓库。在使用第三方仓库时,需要在 Maven 项目的配置中明确指定仓库的地址。
5.1 自定义本地仓库地址
-
找到
settings.xml
文件:- 在 Maven 安装目录下的
conf
文件夹里,会有一个名为settings.xml
的文件,这是全局的配置文件。 - 也可以在用户目录(例如 Windows 系统下的
C:\Users\用户名\.m2
)下创建或修改settings.xml
文件,这个文件的配置会覆盖全局配置。
- 在 Maven 安装目录下的
-
编辑
settings.xml
文件:打开
settings.xml
文件,找到<localRepository>
标签。把标签内的值修改为期望的本地仓库目录地址。<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><!-- 自定义本地仓库地址 --><localRepository>D:/maven/repo</localRepository><!-- 其他配置 --> </settings>
5.2 Maven镜像设置
如果访问 Maven 的中央仓库非常慢,我们可以选择一个速度较快的 Maven 的镜像仓库。
在用户主目录下进入.m2
目录,创建或打开 settings.xml
文件,在 <mirrors></mirrors>
标签中添加 mirror
子节点:
<mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url>
</mirror>
其他镜像地址:
华为云:https://repo.huaweicloud.com/repository/maven/
清华大学:https://repo.maven.apache.org/maven2/
中科院:http://maven.opencas.cn/maven/
5.3 搜索第三方组件
如果我们要引用一个第三方组件,比如 gson
,如何确切地获得它的 groupId
、artifactId
和version
?方法是通过提供仓库搜索服务的网站搜索关键字,找到对应的组件后,直接复制相应的信息。这里推荐 3 个提供仓库搜索服务的网站:
- https://search.maven.org/
- https://central.sonatype.com/
- https://mvnrepository.com/
6.Maven常见命令
mvn clean
:表示运行清理操作(会默认把target文件夹中的数据清理)。mvn clean compile
:表示先运行清理之后运行编译,会将代码编译到target文件夹中。mvn clean test
:运行清理和测试。mvn clean package
:运行清理和打包。mvn clean install
:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。mvn clean deploy
:运行清理和发布(发布到私服上面)。mvn help:effective-settings
:查看 Maven 的有效配置信息。
7.Maven常用POM属性
${project.build.sourceDirectory}
:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}
:项目的测试源码目录,默认为/src/test/java/
${project.build.directory}
:项目构建输出目录,默认为target/
${project.build.outputDirectory}
:项目主代码编译输出目录,默认为target/classes/
${project.build.testOutputDirectory}
:项目测试代码编译输出目录,默认为target/testclasses/
${project.groupId}
:项目的 groupId.${project.artifactId}
:项目的 artifactId.${project.version}
:项目的 version,于${version}
等价${project.build.finalName}
:项目打包输出文件的名称,默认为${project.artifactId}${project.version}
8.在IDEA中配置Maven
9.mvnw
mvnw
是 Maven Wrapper 的缩写。因为我们安装 Maven 时,默认情况下,系统所有项目都会使用全局安装的这个 Maven 版本。但是,对于某些项目来说,它可能必须使用某个特定的 Maven 版本,这个时候,就可以使用 Maven Wrapper,它可以负责给这个特定的项目安装指定版本的 Maven,而其他项目不受影响。
简单地说,Maven Wrapper就是给一个项目提供一个独立的,指定版本的 Maven 给它使用。
安装Maven Wrapper:
安装 Maven Wrapper 最简单的方式是在项目的根目录(即 pom.xml
所在的目录)下运行安装命令:
mvn wrapper:wrapper
它会自动使用最新版本的 Maven。如果要指定使用的 Maven版本,使用下面的安装命令指定版本,例如3.9.0
:
mvn wrapper:wrapper -Dmaven=3.9.0
安装后,查看项目结构:
my-project
├── .mvn
│ └── wrapper
│ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ └── resources
└── test
├── java
└── resources
发现多了 mvnw
、mvnw.cmd
和.mvn
目录,我们只需要把 mvn
命令改成 mvnw
就可以使用跟项目关联的Maven。
10.pom.xml
文件示例
<?xml version="1.0" encoding="UTF-8"?>
<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"><!-- 模型版本,固定为 4.0.0 --><modelVersion>4.0.0</modelVersion><!-- 组织 ID,通常是公司或组织的域名倒序 --><groupId>com.example</groupId><!-- 项目的唯一标识符 --><artifactId>my-project</artifactId><!-- 项目版本 --><version>1.0.0</version><!-- 项目打包类型,常见的有 jar、war 等,这里是 jar 包 --><packaging>jar</packaging><!-- 项目名称,可自定义 --><name>My Project</name><!-- 项目描述,可简要说明项目用途 --><description>A simple Java project.</description><!-- 项目的 URL,通常是项目的主页地址 --><url>http://example.com</url><!-- 项目依赖 --><dependencies><!-- 示例:添加 JUnit 依赖用于单元测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.8.2</version><scope>test</scope></dependency><!-- 可以添加其他依赖,如 Spring、MyBatis 等 --></dependencies><!-- 构建配置 --><build><sourceDirectory>src/main/java</sourceDirectory><testSourceDirectory>src/test/java</testSourceDirectory><plugins><!-- 编译插件,指定 Java 版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source><target>11</target></configuration></plugin></plugins></build>
</project>
🤗🤗🤗
参考
- 廖雪峰-Maven