Maven是一个跨平台的项目管理工具,主要用于基于 Java 平台的项目(Maven 底层为Java)构建、依赖包管理和项目信息管理,只需要运行一条简单的命令,就能高效的完成构建动作
Maven 能提供一种项目的依赖配置,配置好的项目,Maven 能自动的从 Maven 的中央仓库中下载并管理项目依赖的 jar 包,并且还能自动的管理这些 jar 包依赖的其他 jar 包,同时提供了一种标准的项目目录结构(约定大于配置)
Maven 版本对 JDK 有要求
// 命令行输入,查询安装 JDK 是否正确并查询安装的版本
java -version
// 没有配置的话,则进行jdk配置
1.添加 JAVA_HOME,需要指向 JDK 安装目录;
2.添加 PATH,添加 %JAVA_HOME%\bin。
于官网下载对应的压缩包,将apache-maven-x.x.x-bin.zip 解压到目录中,目录路径不要有空格和中文。
① 配置环境变量,MAVEN_HOME,指向 maven 的根目录;
② 配置环境变量 Path,将 %MAVEN_HOME%\bin 追加到 Path 中。
// 命令行窗口执行,查看版本信息
mvn –v
mvn compile:编译,在项目下生成一个target目录,里面是编译后的.class文件
mvn clean:清除,将编译后的target目录删除
mvn test:测试,会在项目下生成源码编译后的文件以及测试文件编译后的文件
mvn package:打包,执行项目的编译测试命令,并且将项目打包成jar 或war
mvn install:打包,本地仓库也放一份.执行项目的编译 测试 打包操作。
运行 Maven 命令会在用户目录生成一个 .m2 目录,该目录下有个目录名 repository,也就是本地仓库,用于存放一些下载的 jar 文件。本地仓库默认位置在用户目录/.m2/repository(不建议放在系统盘)
① 将 Maven 根目录的 conf/settings.xml 拷贝到 .m2 中,作为个人 Maven 配置文件;
② 在 settings.xml 文件中 修改本地仓库的位置。
<?xml version="1.0" encoding="UTF-8"?>
<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>本地仓库目录</localRepository>
</settings>
官方中央仓库服务器在国外,可能会下载失败,为减少下载失败的概率配置一个中央仓库的镜像
<?xml version="1.0" encoding="UTF-8"?>
<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>你本地仓库的目录位置</localRepository>
<mirrors>
<!-- 阿里仓库镜像 -->
<mirror>
<id>aliyunId</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
</settings>
<?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>cn.tj</groupId>
<artifactId>play_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
索引指为本地仓库的依赖建立索引,本地仓库存在依赖,在添加时可以搜索出来,便于在 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>cn.tj</groupId>
<artifactId>play_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--添加依赖信息名称版本作用域-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
同上
<?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>cn.tj</groupId>
<artifactId>play_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--修改打包方式-->
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
于项目的 main 目录下创建 webapp/WEB-INF/web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
<?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>cn.tj</groupId>
<artifactId>play_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--修改打包方式-->
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
</properties>
</project>
<!--添加依赖信息名称版本作用域-->
<dependencies>
<!-- 配置 servlet-api 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Hi.java
@WebServlet("/Hi")
public class Hi extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("msg", "Play Maven");
req.getRequestDispatcher("/WEB-INF/hi.jsp").forward(req, resp);
}
}
hi.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Maven</title>
</head>
<body>
${msg}
</body>
</html>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--端口,路径,GET 方式乱码处理-->
<configuration>
<port>80</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
标识项目或者依赖在仓库中的位置
groupId:项目名称,一般为公司或组织域名倒写
artifactId:项目中 Maven 项目/模块名称,区分不同的项目
version:项目版本,区分同一个项目的不同时期
配置项目所要依赖的 jar,于 pom.xml 中 dependency 元素配置,通过坐标先从本地仓库找,没有再从远程仓库找。
① scope
Maven 在编译,测试,运行时,各有一套 classpath。scope 表明该依赖的项目和三个 classpath 的关系,即表示依赖什么阶段起作用,什么阶段不起作用。
scope 主要可选值:
compile:默认,适用于所有阶段,随着项目一起发布,编译,测试,运行时都有效
provided:编译和测试时使用;如 servlet-api.jar lombok,不需打包,容器会提供
runtime:测试和运行时使用,用于接口和实现分离,如 jdbc 具体驱动实现 mysql 驱动
test:测试时使用,不会随项目发布,如 junit
② 传递性
Maven 依赖具有传递性,如 A -> B,B -> C, A 间接依赖于 C,其中 A 对于 B 是第一直接依赖,B 对于 C 是第二直接依赖,C 为 A 的传递性依赖,由此解决依赖繁琐的问题。