1.基本概念
Maven 是一个项目管理工具,将项目的开发和管理过程抽象为一个项目对象模型(POM Project Object Model)。
1.2.下载与安装
可以从 Maven 选择对应的平台和版本的 Maven 进行下载。
Maven 运行会使用两个环境变量:
-
JAVA_HOME,jdk 根目录
-
MAVEN_HOME,Maven 根目录
如果没有配置,需要在操作系统中添加。
Maven 本体用 Java 编写,由MAVEN_HOME/lib
目录下的 jar 包构成,Windows 版本的 Maven 启动文件是 MAVEN_HOME/bin
目录下的 mvn 或 mvn.bat。
为了方便在任何路径下都能运行 mvn 命令,需要将该目录加入环境变量Path
。
可以在环境变量中使用已有环境变量,比如使用
%MAVEN_HOME%/bin
而非具体路径。
安装好后可以用以下命令测试:
❯ mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: D:\software\coding\apache-maven-3.8.6
Java version: 1.8.0_332, vendor: Temurin, runtime: D:\software\coding\eclipse_jdk1.8\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
1.3.仓库
用 Maven 创建的 Java 程序通常都会依赖其他的 jar 包,这些 jar 包保存在 Maven 的中央仓库()。
除了直接从中央仓库拉取 jar 包以外,如果是多人协同开发,也可以架设私有仓库,以便缓存一些大家都会使用的 jar 包,这样可以提高下载速度。
1.3.1.镜像加速
Maven 的中央仓库访问速度慢,国内访问不友好,可以使用国内的一些镜像仓库进行加速。
方式是修改MAVEN_HOME/conf/settings.xml
配置文件,在其中添加:
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>
这里是提供的镜像服务。
类似的,还有阿里云的:
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
这里的
mirrorOf
指定为什么样仓库使用镜像,一般填central
表示中央仓库,*
表示所有仓库。实际使用中发现很多时候虽然配置了阿里云镜像仓库,但实际上依然会使用中央仓库下载,速度很慢。可以通过在 Maven 项目中添加以下仓库信息来解决这个问题:
<repositories> <repository> <id>central</id> <url>https://maven.aliyun.com/repository/central</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
实际使用中我发现国内的镜像仓库保存的依赖似乎不完整,尤其是对较老版本的依赖或者最新的依赖。所以有时候依然需要我们从中央仓库下载:
<mirror>
<id>central</id>
<url>https://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
1.3.2.本地仓库
Windows 下默认的本地仓库目录是USER_HOME\.m2
,比如我本机上就是C:\Users\icexmoon\.m2
。
可以在本地仓库根目录添加一个
settings.xml
作为个人 Maven 配置,会覆盖前边提到的全局配置。
因为会占用 C 盘空间,所以我们最好将其修改为其它目录。这同样需要我们修改配置文件:
<localRepository>D:\software\maven\repo</localRepository>
除了修改配置文件指定其它目录以外,也可以,将默认的C盘本地仓库目录指向一个其它盘符下的目录。
1.3.3.坐标
如何从一个 Maven 仓库中指定我们需要的 jar 包?
仓库中的 Jar 包用坐标进行定位和区分。可以通过 这个网站检索我们需要的 Jar 包对应的坐标。
比如查找 JUnit 并选择 4.13.2 这个版本,可以找到类似下面的坐标信息:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
其中的节点意义为:
-
groupId,组织(公司)标识,一般使用组织拥有的域名反写,比如 cn.icexmoon。
-
artifactId,项目标识
-
version,版本号
这些节点共同唯一定义一个 jar 包在仓库中的坐标。
2.第一个 Maven 项目
下载示例项目。
2.1.pom.xml
Maven 项目的根目录下都有一个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">
<!-- POM 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织标识 -->
<groupId>com.itheima</groupId>
<!-- 项目标识 -->
<artifactId>java01</artifactId>
<!-- 版本 -->
<version>1.0-SNAPSHOT</version>
<!-- 引入的依赖 -->
<dependencies>
<!-- Junit 依赖(坐标)-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
2.2.目录结构
Maven 项目都有统一的目录结构,比如这个示例项目:
├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─itheima │ │ └─resources │ └─test │ ├─java │ │ └─com │ │ └─itheima │ └─resources └─target
主要有三个目录:
-
/src/main
,项目代码和静态资源 -
/src/test
,测试代码和静态资源 -
/target
,编译后的字节码和 jar 包
2.3.Maven 命令
Maven 可以在一系列插件的帮助下帮我们编译、测试、打包项目。
2.3.1.编译项目
在项目根目录下执行命令mvn compile
即可以编译 Maven 项目。
Maven 会先检查本地仓库中是否有所需的插件,如果没有,会从远程仓库下载。比如类似的输出信息:
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ java01 ---
最后出现如下信息表示编译成功:
[INFO] Compiling 1 source file to D:\workspace\java01\target\classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:10 min [INFO] Finished at: 2023-08-19T18:34:34+08:00
此时项目下会出现/target
目录,其中的classes
目录中保存编译后的字节码。
2.3.2.清理
命令mvn clean
可以清理项目编译产生的内容:
❯ mvn clean ... [INFO] Deleting D:\workspace\java01\target [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 7.901 s [INFO] Finished at: 2023-08-19T18:43:15+08:00 [INFO] ------------------------------------------------------------------------
2.3.3.测试
示例项目中包含一个测试用例:
package com.itheima;
import org.junit.Assert;
import org.junit.Test;
public class DemoTest {
@Test
public void testSay(){
Demo d = new Demo();
String ret = d.say("itheima");
Assert.assertEquals("hello itheima",ret);
}
}
可以用命令mvn test
执行项目中的测试用例:
❯ mvn test ... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.itheima.DemoTest hello itheima Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.087 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
输出中包含测试用例执行的结果。此外,在/target/surefire-reports
目录中会生成测试报告。
2.3.4.打包
mvn package
命令可以对项目进行打包,打包后生成的 jar 包在/target
目录下。
默认情况下打包会包含编译和测试环节。
2.4.用插件创建工程
手动创建工程麻烦且容易出错,可以用 Maven 插件创建工程目录结构和 pom.xml 文件:
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
2.4.1.创建 Java 工程
mvn archetype:generate ^
-DgroupId=com.itheima ^
-DartifactId=java-project ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-Dversion=0.0.1-snapshot ^
-DinteractiveMode=false
以上命令适用于CMD,CMD下使用
^
实现命令换行,Linux 下使用\
。第一次运行需要下载插件,比较花费时间。
创建好的目录如下:
D:. │ pom.xml │ └─src ├─main │ └─java │ └─com │ └─itheima │ App.java │ └─test └─java └─com └─itheima AppTest.java
自动生成的 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.itheima</groupId>
<artifactId>java-project</artifactId>
<packaging>jar</packaging>
<version>0.0.1-snapshot</version>
<name>java-project</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
创建好的项目自动添加了一个 Junit 的依赖,并添加了一个入口类和相应的测试用例。
2.4.2.创建 Web 工程
mvn archetype:generate ^
-DgroupId=com.itheima ^
-DartifactId=web-project ^
-DarchetypeArtifactId=maven-archetype-webapp ^
-Dversion=0.0.1-snapshot ^
-DinteractiveMode=false
2.5.用 Idea 创建工程
如何用 Idea 创建 Maven 工程可以观看这个。
参考资料
文章评论