1、基本概念

1.1、Maven 能干什么

改进项目的开发和管理,需要 Maven

  1. Maven 可以管理 jar 文件
  2. 自动下载 jar 和他的文档、源代码
  3. 管理 jar 直接的依赖(a.jar 需要b.jar,Maven 会自动下载 b.jar)
  4. 管理你需要的 jar 版本
  5. 帮你编译程序
  6. 帮你测试你的代码是否正确
  7. 帮你打包文件,形成 jar 文件,或 war 文件
  8. 帮你部署项目

构建(项目的构建)

构建是面向过程的,就是一些步骤,完成项目代码的编译、测试、运行、打包、部署等等

Maven 支持的构建包括:

  1. 清理
    把之前项目编译的东西删除,为新的编译代码做准备
  2. 编译
    把程序源代码编译为执行代码
    Maven 可以批量的将多个 .java 文件编译为 .class 文件
    javac 一次编译一个文件
  3. 测试
    Maven 可以同时执行多个测试程序的代码。同时测试很多功能
  4. 报告
    生成测试结果的文件,测试通过没有
  5. 打包
    把你项目中所有的 .class 文件、配置文件等所有资源放到一个压缩文件中,这个压缩文件就是项目的结果文件
    通常 Java 程序压缩文件是 jar 扩展名,web 应用的阿压缩文件是 war 扩展名
  6. 安装
    将上一步打包的文件 jar 、war 安装到本地仓库,这样就可以当做依赖进行引用
  7. 部署
    把程序安装好就可以执行

1.2、Maven 定义和作用

  • Maven 翻译为 “知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具;
  • Maven 主要用作基于 Java 平台的项目(Maven 本身也是 Java 编写的)的构建、依赖包管理和项目信息管理;
  • Maven 能提供一种项目的配置,配置好的项目,只需要运行一条简单的命令,就能完成重复的,繁琐的构建动作;
  • Maven 能提供一种项目的依赖配置,配置好的项目,Maven 能自动的从 Maven 的中央仓库中帮我们下载并管理项目依赖的 jar 包,并且还能自动的管理这些 jar 包依赖的其他 jar 包;
  • Maven 提供了一种标准的项目目录结构,测试命名规则等项目的最佳实践方案,统一了不同项目的学习成本(约定大于配置)。

1.3、Maven 核心概念

1.3.1、pom

全称 Project Object Model 项目对象模型

Maven 把一个项目当做一个模型使用,控制 Maven 构建项目的过程,管理 jar 依赖

1、基本信息:
modelVersion: Maven 模型的版本,现在是 4.0.0
groupId: 组织 id
artifactId:模块名,通常是工程名
version:版本号
packaging: 项目打包的类型,可以使用 jar、war、rar、ear、pom,如果没写,默认是 jar

2、依赖:
dependencies 和 dependency:Maven 的一个重要作用就是管理 jar 包,这些 jar 包被称为依赖,使用标签 dependency 来配置
这种依赖的配置是通过坐标来定位的

3、配置属性:
properties:使用来定义一些配置属性的,比如 properties.build.sourceEncoding (项目构建源码编码方式),可以设置为 UTF-8 ,防止中文乱码
也可以定义相关构建版本号,便于日后统一升级

4、构建:
build:表示与构建相关的配置,例如设置编译插件的 jdk 版本

5、继承:
parent:在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupID、version、有相同的依赖、或有相同的组件配置等,用 parent 声明要继承的父工程的 pom 配置

6、聚合:
modules:在 Maven 的多模块开发汇总,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式问 pom,并且在其中使用 modules 聚合的其他模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合

1.3.2、约定的目录结构

在这里插入图片描述

1.3.3、坐标

Maven 把任何一个插件都作为仓库中的一个项目进行管理,用一组(三个)向量组成的坐标来表示,坐标在仓库中可以唯一定位一个 Maven 项目

groupId:组织名,通常是公司域名倒写+项目名
artifactId:模块名,通常是工程名
version:版本号

注意:
项目在仓库中的位置是由坐标来决定的

1.3.4、依赖

配置项目所要依赖的 jar,在 pom.xml 使用 dependency 元素配置,通过坐标先从本地仓库找,若没有再从远程仓库找

pom.xml 加入依赖的方式:
在这里插入图片描述

scope 依赖范围

表示依赖使用的范围,也就是 Maven 构建项目的哪些阶段中起作用

编译、测试、打包、安装、部署

Maven 在编译,测试,运行的时候,各需要一套 classpath(比如编译的时候会有编译的 classpath,测试的时候会有测试的 classpath)

scope 表明该依赖的项目和三个 classpath 的关系,即表示依赖什么阶段起作用,什么阶段不起作用

scope 主要可选值:

  • compile默认,适用于所有阶段,会随着项目一起发布,在所有阶段都有效;
  • provided:编译和测试阶段使用;典型的如 servlet-api.jar,打包时不需要,容器来提供;
  • runtime:测试和运行阶段使用,用于接口和实现分离,典型的如 jdbc 具体驱动实现;
  • test:测试阶段使用,不会随项目发布,如 junit。

在这里插入图片描述

传递性

Maven 的依赖是具有传递性的,比如 A -> B,B -> C,那么 A 间接的依赖于 C,这就是依赖的传递性

其中 A 对于 B 是第一直接依赖,B 对于 C 是第二直接依赖,C 为 A 的传递性依赖。依赖的传递性可以解决依赖繁琐的问题

1.3.5、仓库

  • 概念:
    仓库是存放 Maven 使用的 jar 和我们项目使用的 jar
  • 分类
    仓库分为本地仓库(个人计算机上的文件夹)和远程仓库
    远程仓库在互联网上,是使用网络才能使用的仓库
    中央仓库:最权威的
    镜像仓库:是中央仓库的备份
    私服:在公司内部,在局域网中使用,不对外使用
  • 仓库的使用不需要人为参与
    开发人员使用 jar 时候:Maven 首先在本地仓库寻找–>私服–>镜像–>中央仓库

1.3.6、生命周期、常用命令、插件

就是指 Maven 构建项目的过程:清理、编译、测试、报告、打包、安装、部署

生命周期的各个阶段都提供相对应的命令,通过命令,完成 Maven 生命周期的执行(详见下面 Maven 的常用命令,而命令的实现又是通过 插件)

构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成(Maven 会自动给你构建好)

不论现在要点击执行生命周期中的哪个阶段,运行的时候都是从这个生命周期的最初阶段开始执行的

Maven 的常用命令:
执行的时候,DOS窗口需要在 pom.xml 所在目录

  1. mvn clean:清理
    删除原来编译和测试的目录(target目录),但是已经安装到仓库里面的包不会删除
  2. mvn compile:编译主程序
    会在当前目录下生成 target 目录,里面存放编译程序之后生成的字节码文件
  3. mvn test-compile:编译测试程序
  4. mvn test:测试
    会生成一个目录 surefire-reports,保存测试结果
  5. mvn package:打包主程序
    会先编译主程序、编译测试程序、测试,然后按照 pom.xml 配置把主程序打包生成 jar 或 war 包
  6. mvn install:安装主程序
    会在上一步打包的基础上,按照本工程的坐标将包保存到本地仓库中
  7. mvn deploy:部署主程序
    会打包,将包放在本地仓库,并且保存到私服仓库中,还会自动把项目部署到 web 容器中

Maven 的插件:
Maven 的命令执行时,真正完成功能的是插件,插件就是一些 jar 文件、一些类

插件可以自己在项目汇总设置,最常使用的是 maven 编译插件,设置项目使用的 jdk 版本时通过编译插件指定:
pom.xml 文件使用 build 标签设置
在这里插入图片描述

在这里插入图片描述

1.3.7、插件和目标

  • Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
  • 每个插件都能实现多个功能,每个功能就是一个插件目标
  • Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务

例如:
compile 是插件 maven-compiler-plugin 的一个目标
pre-clean 是插件 maven-clean-plugin 的一个目标

2、Maven 安装

2.1、检查 JDK 的版本

因为 Maven 不同的版本对 JDK 是有要求的,具体请看官网

在命令行输入 java -version,查询安装 JDK 是否正确并查询安装的版本。若没有配置好的话,按照以下步骤配置好:

  • 添加 JAVA_HOME,需要指向 JDK 安装目录;
  • 添加 PATH,添加 %JAVA_HOME%\bin。

2.2、安装 Maven

把 apache-maven-x.x.x-bin.zip 解压到目录中(目录路径最好不要有空格和中文)

2.3、配置环境变量

  • 配置环境变量,MAVEN_HOME,指向 maven 的根目录;
    在这里插入图片描述

  • 配置环境变量 Path,将 %MAVEN_HOME%\bin 追加到 Path 中。

2.4、验证 Maven 安装

打开命令行窗口,输入入 mvn –v 执行,若执行类似如下效果即代表安装成功

在这里插入图片描述

3、Maven Hello World

在这里插入图片描述

把事先准备好的 Maven 项目,在命令行下输入命令试下:

  • mvn compile:编译
  • mvn clean:清除
  • mvn test:测试
  • mvn package:打包
  • mvn install:打包,本地仓库也放一份

4、Maven 设置

4.1、本地仓库

运行过 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>
    	<mirrors>
    		<!-- 阿里仓库镜像 -->
    		<mirror>
    			<id>alimaven</id>
    			<name>aliyun maven</name>
    			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    			<mirrorOf>central</mirrorOf>
    		</mirror>
    	</mirrors>
    </settings>
    

4.2、IDEA 中 Maven 的配置

配置安装的 Maven,设置 setttings.xml 和本地仓库
在这里插入图片描述
在这里插入图片描述
还要给以后的项目设置一下

在这里插入图片描述

5、基于 Maven 构建的 JavaSE 项目

5.1、创建项目

通过非骨架方式创建

  1. 选择建的是 Maven 项目
    在这里插入图片描述
    确定后之后点击 Next

  2. 填写对应项目信息
    在这里插入图片描述
    填完之后点击 Next

  3. 确定项目存储位置
    在这里插入图片描述
    确定完之后点击 Finish,之后工具会打开解析项目,要等一会儿

注意要让工具自动解析修改的内容
在这里插入图片描述
没有弹窗设置自动导入窗口的,可以手动设置一下:
File—Settings—import Maven projects automatically—OK

在这里插入图片描述

通过骨架方式创建(联网)

在这里插入图片描述

5.2、pom.xml 文件

用于填写项目信息,打包方式,添加依赖及插件等
在这里插入图片描述

5.3、设置属性

使用 properties 标签设置

    <!--属性-->
    <properties>
        <!--maven 构建项目使用的是 UTF-8 ,避免中文的乱码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--编译 java 代码使用的 jdk 版本-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <!--Java 项目运行在什么样的 jdk 版本-->
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

5.3、添加依赖

5.3.1、利用索引添加依赖

所谓建索引,就对本地仓库的依赖建立索引,若本地仓库存在 10 个依赖,那么在添加的时候可以搜索得出来,很方便在 pom.xml 添加

但注意搜索得出来是本地仓库已有的前提下

而这个索引在 IDEA开发工具会自动建好,直接使用即可

步骤如下:

  1. 添加 dependencies 元素在这里插入图片描述

  2. 添加 dependency 元素
    在这里插入图片描述

  3. 填选依赖名称
    在这里插入图片描述

  4. 选择依赖的版本
    在这里插入图片描述

  5. 填写依赖的作用域
    在这里插入图片描述

  6. 让工具自动解析修改的内容
    在这里插入图片描述

  7. 验证依赖添加成功
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.3.2、网站搜索拷贝添加依赖

点击此处搜索依赖

步骤如下:

  1. 在搜索栏中输入要添加的依赖
    在这里插入图片描述

  2. 选择所要的依赖和其版本
    在这里插入图片描述

  3. 拷贝对应配置到 pom.xml 中
    在这里插入图片描述

5.4、使用 Maven 命令

在 Maven Projects 窗口,双击对应命令即可:
在这里插入图片描述
遇到爆红可以尝试 clean + install +刷新

6、基于 Maven 构建的 JavaWeb 项目

6.1、创建项目

通过非骨架方式创建

  1. 选择建的是 Maven 项目
    在这里插入图片描述
    确定后之后点击 Next

  2. 填写对应项目信息
    在这里插入图片描述
    填完之后点击 Next

  3. 确定项目存储位置
    在这里插入图片描述
    确定完之后点击 Finish,之后工具会打开解析项目,要等一会儿
    注意要让工具自动解析修改的内容
    在这里插入图片描述

  4. 注意要设置项目打包方式
    在 pom.xml 设置:
    在这里插入图片描述

通过骨架方式创建(联网)

在这里插入图片描述

6.2、添加 web.xml

自己手动在项目的 main 目录下建 webapp/WEB-INF/web.xml 文件,拷贝如下内容:

在这里插入图片描述

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
</web-app>

6.3、修改项目编译运行版本

在 pom.xml 添加如下插件:

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source><!-- 项目的编译版本 -->
                    <target>1.8</target><!-- 项目的运行版本 -->
                    <encoding>utf-8</encoding><!-- Java 编译器读取你的文件用的编码 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

6.4、添加 servlet 依赖

在 pom.xml 文件添加如下依赖:

    <dependencies>
        <!-- 配置 servlet-api 依赖 -->
        <!--加入 servlet 依赖(servlet的jar)-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <!-- 记得一定配置作用域 -->
            <scope>provided</scope>
        </dependency>
        <!--加入 jsp的依赖(jsp相关的jar) -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

6.5、配置 Tomcat 插件

在 pom.xml 添加如下插件:

    <build>
        <plugins>
            <!--
                Maven 插件
                下面这个插件包含一个 Tomcat7,下载一个 Tomcat 到本地仓库里面
                提供命令,可以开发提供配置,把使用该插件的 Maven 部署到这个 Tomcat 上启动
            -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>8080</port> <!-- 端口 -->
                    <path>/</path> <!-- 上下路径 -->
                    <uriEncoding>UTF-8</uriEncoding> <!-- 针对 GET 方式乱码处理 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

6.6、编写 Servlet 与 JSP

选中文件夹,Alt+Insert 新建文件
在这里插入图片描述
编写 Servlet:

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.println("hello Maven web");
        writer.flush();
        writer.close();
    }
}

编写 JSP:
注意 jsp 文件要放在 webapp 目录下
在这里插入图片描述

6.7、启动项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:
项目是用使用 localhost:8080/项目名 访问,可是就是访问不到。查看插件配置此处为 " / ",可以不带项目名访问项目
在这里插入图片描述

将 web 项目打包生成的 .war 压缩包拷贝到客户的 Tomcat 的 webapps 目录下,即可进行运行

7、 Maven 常用设置

7.1、设置属性

properties 标签设置属性

    <!--属性-->
    <properties>
        <!--maven 构建项目使用的是 UTF-8 ,避免中文的乱码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--编译 java 代码使用的 jdk 版本-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <!--Java 项目运行在什么样的 jdk 版本-->
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

7.2、全局变量(自定义属性)

在 properties 标签里面通过自定义标签声明变量(标签名就是变量名)

在 pom.xml 文件中的其他位置,使用 ${标签名}的形式使用变量的值

自定义全局变量一般是定义 依赖的版本号,当你的项目中要使用多个相同的版本号,先使用全局变量定义,然后使用 ${变量名}

    <properties>
        <!--自定义变量,表示版本号-->
        <junit.version>4.11</junit.version>
    </properties>
    <!--依赖-->
    <dependencies>
        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

7.3、指定资源位置插件

在 MyBatis 中会用到

    <build>
        <resources>
            <resource>
                <!--所在目录-->
                <directory>src/main/java</directory>
                <!--包括目录下的 .properties .xml 文件都会扫描到-->
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <!--filtering 选项 false 表示不启用过滤器,*.properties 已经有过滤的作用了-->
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

作用:
默认没有使用 resources 标签(没有使用上面代码)的时候:
maven 执行编译代码时,会把 src/main/resources 目录中的文件拷贝到 target/classes 目录中
对于 src/main/java 目录下的非 java 文件不处理,不拷贝到 target/classes 目录中

现在有一些文件放在 src/main/java 目录下,且执行程序时候需要用到,那么就要告诉 maven ,执行编译代码时,需要把文件一同拷贝到 target/classes 目录中,就是用上面的代码

所在目录:就是要拷贝的文件所在目录
includes:就是要拷贝的文件类型

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐