1 初识 Maven

  • Maven 是 Apache 基金会的开源项目,使用 Java 开发。是项目的自动化构建工具
  • 构建环节: 清理、编译、测试、报告、打包、安装、部署
  • 用途
  • 项目的自动构建,帮助开发人员做项目的编译、测试、打包、安装、部署等工作
  • 管理依赖(项目中使用的各种 jar 包)
  • 依赖:项目中需要使用的其他资源, 常见的是 jar 包
  • 例如:项目要使用 mysql 驱动。就说项目依赖 mysql 驱动
  • 获取
  • 安装:
  1. 确定 JAVA_HOME 指定 jdk 的安装目录
  2. 解压下载的 Maven.zip
  • 目录的路径不要有中文, 不要有空格。
  1. 把 maven 安装目录中下的 bin 的路径添加到 path 中
  2. 测试 maven 安装是否成功
  • 在命令行执行mvn -v
  • 出现如下命令则成功安装
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\Maven\Maven3.3.9\bin\..
Java version: 1.8.0_281, vendor: Oracle Corporation
Java home: D:\java\jdk\jdk1.8.0\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
  • maven 目录结构
  • 使用方式:
  1. 独立使用:可以独立创建项目,编译代码,测试程序,打包,部署等等
  • 大多数文件、文件夹自己创建或者导入
  1. 与 IDEA 一起使用:通过 IDEA 借助 maven,实现编码,测试,打包等等

2 Maven 核心概念

2.1 约定的目录结构

  • 约定的目录结构:maven 项目使用的大多人遵循的目录结构
  • 一个 maven 项目设置一个文件夹。 比如项目叫做 Hello World

main:主程序目录(完成项目功能的代码和配置文件)

main\java:存放源代码目录(包和相关的类定义)

main\resource:存放源代码配置文件目录

test:存放测试程序代码的目录(开发人员自己写的测试代码)

text\java:存放测试代码的单元测试(junit)目录

test\resource:存放测试程序需要的配置文件目录

pom.xml:maven的配置文件, 核心文件

2.2 POM 文件

  • POM: Project Object Model 项目对象模型
  • maven 把项目当做模型处理,操作这个模型就是操作项目。
  • maven 通过 pom.xml 文件实现项目的构建和依赖的管理
  • pom.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>

<!-- project 是根标签, 后面是约束文件 -->
<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 模型的版本, 就是4.0.0 -->  
  <modelVersion>4.0.0</modelVersion>

  <!-- 坐标 -->  
  <groupId>com.bjpowernode</groupId>
  <artifactId>ch01-maven</artifactId>
  <version>1.0-SNAPSHOT</version>
  
  <properties>
     <java.version>1.8</java.version>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  
</project>

2.3 坐标

  • 坐标概念来自数学,组成是 groupId, artifiactId, version
  • 坐标作用:确定资源的,是资源的唯一标识
  • 在 maven 中,每个资源都是坐标,坐标值是唯一的。简称为:gav
  • 项目使用 gav :
  1. 每个 maven 项目,都需要有一个自己的 gav
  2. 管理依赖,需要使用其他的 jar ,也需要使用 gav 作为标识
<groupId>com.bjpowernode</groupId>
<artifactId>ch01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

groupId:指组织名称,公司,团体或者单位的标识

  • 常使用的公司域名的倒写
  • 如果项目规模比较大, 也可以是 域名倒写+大项目名称。

artifactId:指项目名称

  • 如果 groupId 中有项目, 此时当前的值就是子项目名
  • 项目名称是唯一的。

version:指版本、项目的版本号,推荐使用三位数字组成。例如主版本号.次版本号.小版本号

  • 注意:版本号中有 -SNAPSHOT, 表示快照,不是稳定的版本

packaging:指项目打包的类型, 有 jar、war、ear、pom等等。默认是 jar

2.4 依赖

  • 依赖(dependency):项目中要使用的其他资源(jar)
  • 需要在 pom.xml 文件中,使用 dependencies 和 dependency 标签以及 gav 标签共同完成依赖的说明
  • 使用 gav 作为标识,从互联网下载依赖的 jar,再由 maven 管理项目使用的这些 jar
  • 格式:
<dependencies>
    <dependency>
        <groupId>XXXX</groupId>
        <artifactId>XXXX</artifactId>
        <version>XXXX</version>
    </dependency>
</dependencies>
  • 例如:
<dependencies>
  
    <!-- 日志 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    
    <!-- mysql 驱动 -->
     <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.16</version>
    </dependency>

</dependencies>
  • 判断 jar 是否能使用技巧:如果 仓库中的 jar 包以 .lastUpdated 结尾一定是使用不了的
  • 例如:

2.5 仓库

  • maven 仓库存放:

    1. maven 工具自己的 jar 包
    2. 第三方的其他 jar, 比如项目中要使用 mysql 驱动
    3. 自己写的程序,可以打包为 jar 存放到仓库
  • 仓库分为本地仓库和远程仓库

  1. 本地仓库(本机仓库): 位于自己的计算机, 是磁盘中的某个目录

    • 本地仓库:默认路径:登录操作系统的账号的目录中的 /.m2/repository

      C:\Users\Handsome Black\.m2\repository
    • 修改本地仓库的位置:修改 maven 的配置文件 setting.xml

      • 路径:maven 的安装路径\conf\setting.xml

      • 步骤:

        1. 创建一个目录,作为仓库使用(存在就不用创建)

          • 目录不要有中文和空格。 目录尽量不要太深
        2. 修改 setting.xml 文件(修改文件时先备份,养成好习惯),创建 localRepository 标签填上目录地址

          • 例如:

            <localRepository>D:/Maven/openrepository</localRepository>
  2. 远程仓库: 需要通过联网访问的

    1. 中央仓库: 一个 ftp 服务器, 存放了所有的资源
    2. 中央仓库的镜像: 就是中央仓库的拷贝。 在各大主要城市都有镜像
    3. 私服:在局域网中使用的。 私服就是自己的仓库服务器。 在公司内部使用的。
  • 使用 maven 仓库:

    1. 当项目启动后, maven 自动使用仓库
    2. 执行了 maven 的命令, maven 会首先访问的是本地仓库, 从仓库中获取所需的 jar
    3. 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像下载
  • 图示:

2.6 生命周期

  • maven 的生命周期:指项目构建的各个阶段。 包括清理、 编译、测试、报告、打包、安装、部署

    • 在测试中会使用到单元测试(junit)
  • 单元测试(junit):junit 是一个单元测试的工具, 在 java 中经常使用

    • 单元:在 java 中指的是方法。一个方法就是一个单元, 方法是测试的最小单位

    • 作用:使用 junit 去测试方法是否完成了要求(开发人员测试)

  • 使用单元测试:

    1. 加入 junit 依赖(一些类和方法)

      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <scope>test</scope>
      </dependency>
    2. 在 项目/src/test/java 目录中创建测试类文件

      • 单元测试使用的建议:

        1. 测试类的定义名称一般是 Test+要测试的类名称

        2. 测试类它的包名和要测试的类包名一样

        3. 在类中定义方法、需要的测试代码

          • 方法的定义规则:使用 public 访问修饰符、没有返回值、方法名称自定义(建议 Test+测试的方法名称)、不定义参数
        4. 在测试类中的方法,可以单独执行。测试类也可以单独执行

        5. 在方法的上面加入 @Test,表示该方法是单元测试方法

2.7 命令

  • 命令: 执行 maven 功能是由命令发出的

    • 例如:mvn compile
  • 常用命令(同时也是 Maven 程序生命周期演示):

    1. mvn clean:清理命令, 作用删除以前生成的数据, 删除target 目录

      • 使用插件:maven-clean-plugin 版本 2.5
    2. mvn compile:编译命令,执行的代码编译, 把项目/src/main/java 目录中的所有 java 代码编译为 class 文件。同时将 class 文件拷贝到 target/classes 目录

      • classes 是存放类文件的根目录(也叫做类路径,classpath)
      • 使用插件:
        1. maven-compiler-plugin 版本 3.1:编译代码的插件
        2. maven-resources-plugin 版本 2.6:资源插件, 处理文件。作用是把 项目/src/main/resources 目录中的文件拷贝 target/classes 目录中
    3. mvn test-compile:编译命令, 编译 项目/src/test/java 目录中的源文件, 把生成的 class 拷贝到 target/test-classes 目录。同时把 src/test/resources 目录中的文件拷贝到 test-clasess 目录

      • 使用插件:
        1. maven-compiler-plugin 版本 3.1
        2. maven-resources-plugin 版本 2.6
    4. mvn test:测试命令, 作用执行 test-classes 目录的程序, 测试 src/main/java 目录中的主程序代码是否符合要求

      • 使用插件: maven-surefire-plugin 版本 2.12.4
    5. mvn package:打包,作用将把项目中的资源 class 文件和配置文件都放到一个压缩文件中, 默认压缩文件是 jar 类型; web 应用是 war 类型, 扩展是 .jar,.war

      • 使用插件:maven-jar-plugin 版本 2.4:执行打包处理。 生成一个 .jar 文件, 放在 target 目录下

      • 打包的文件包含的是 src/main 目录中的所有的生成的class 和配置文件与 test 无关

      • 打包后的文件名命名规则为 artifactId-version.packaging 的标签组合

        • 例如:ch01-maven-1.0-SNAPSHOT.jar 的 gav 为

          <groupId>com.bjpowernode</groupId>
            <artifactId>ch01-maven</artifactId>
            <version>1.0-SNAPSHOT</version>
            <packaging>jar</packaging>
    6. mvn install : 把生成的打包的文件 ,安装到 maven 仓库方便其他成员使用

      • 使用插件: maven-install-plugin 版本 2.4 :将生成的 jar文件安装到本地仓库

      • jar 包的路径如何生成的?

        • 查看查看中的 jar 文件的 gav

          <groupId>com.bjpowernode</groupId>
            <artifactId>ch01-maven</artifactId>
            <version>1.0-SNAPSHOT</version>
            <packaging>jar</packaging>

          groupId 中的值, 如果有 "." 前和后都是独立的文件夹
          artifactId 也是一个独立的文件夹
          version 也是独立的文件夹

2.8 自定义配置插件

  • 插件:指要完成构建项目的各个阶段,使用 maven 的命令, 执行命令的功能是通过插件完成的。插件就是 jar、一些类

  • 自定义配置插件在 pom.xml 文件中,使用 build 标签设置设置构建项目相关的内容,plugin 设置插件(一个 plugin 一个插件)

    <!-- 设置构建项目相关的内容 -->
    <build>
      <plugins>
        <!-- 设置插件 -->
    	<plugin>XXXX</plugin>
      </plugins>
    </build>
    • build 标签与 dependencies 标签同级

    • 例如:修改 org.apache.maven.plugins 的 jdk 版本

      <build>
        <plugins>
      	<plugin>
      		<groupId>org.apache.maven.plugins</groupId>
      		<artifactId>maven-compiler-plugin</artifactId>
      		<version>3.8.1</version>
      		<configuration>
      			<source>1.8</source> <!-- 指定编译代码的jdk版本 -->
      			<target>1.8</target> <!-- 运行java程序使用的jdk版本-->
      		</configuration>
      	</plugin>
        </plugins>
      </build>

      source:编译的版本

      target:运行的版本

3 Maven 和 IDEA 集成

3.1 IDEA 中集成 maven

  • IDEA 中有一个自带的maven,修改不方便,所有我们一般使用 自己的 Maven,也称为集成 Maven

  • 使当前项目有效的设置步骤

    1. 进入 IDEA 的 Maven 设置界面
    2. 设置 VM Options 值为: -DarchetypeCatalog=internal
      • 使 Maven 创建项目时不下载 archetype-catalong.xml 文件(8 m 左右),加快创建 Maven 项目的速度
  • 导入的 Maven 配置文件依然生效的设置
  • 其他的设置方法同上

3.2 创建基于 maven 项目

  • 普通的 Java 项目
    • 演示的为创建项目(Project),也可以创建工程(Module)。项目、工程具体谁是谁意义不大,做区别使用

  • 创建 web 项目

3.3 IDEA 工具窗口

  • 图示:

  • 用于代替命令控制 Maven,运行过项目的工具窗口还有依赖窗口
    • 例如:

3.4 导入 module 到 idea

  • 图示:

4 Maven 概念相关操作

4.1 依赖管理

  • 依赖范围:使用 scope 标签表示依赖的范围

    ...
    <scope>XXX</scope>
    ...
  • 依赖范围表示这个依赖( jar 和里面类)在项目构建的那个阶段起作用

  • 依赖范围常见值:

    compile

    test

    provided

    对主程序是否有效

    Yes

    No

    Yes

    对测试程序是否有效

    Yes

    Yes

    Yes

    是否参与打包

    Yes

    No

    No

    是否参与部署

    Yes

    No

    No

    compile:参与构建项目的所有阶段。默认采用

    test:测试。例如执行 mvn test 会使用 junit。在测试阶段使用

    provided:提供者。 项目在部署到服务器时,不需要提供这个依赖的 jar 包,而是由服务器这个依赖的 jar 包。明显的是 servlet 和 jsp 依赖

  • 确定依赖值方法:

    1. 在 Maven 仓库存在依赖信息,如果没有就是默认

4.2 properties 标签设置

  • 常用配置

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
        <maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
    </properties>
  • 全局变量

    • 在 properties 标签中定义标签,这个标签就是一个变量, 标签的文本就是变量的值

    • 用途:主要使用全局变量表示多个依赖使用的版本号

    • 步骤:

      1. 在 properties 标签内,自定义一个标签,在内指定版本的值

        <properties>
            ...
          <!--自定义变量-->
            <spring.version>5.2.5.RELEASE</spring.version>
            <junit.version>4.11</junit.version>
        </properties>

        标签名称自定义,建议以"见名知意"为原则

      2. 使用全局变量, 语法格式:${变量名}

        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>${spring.version}</version>
        </dependency>

4.3 指定资源位置

  • 使用资源插件指定资源位置

  • 资源插件用途:告诉 maven 将项目/src/main/java 目录中的指定扩展名的文件,拷贝到 target/classes 目录中

  • maven 默认处理配置文件的方式

  1. maven 会将项目/src/main/resources 目录中的文件, 拷贝到 target/classes 目录下
  2. maven 只处理 src/main/java 目录中的 .java文件,把这些java 文件编译为 class,拷贝到 target/classes 目录中。 不处理其他文件
  • 修改设置方法:使用资源插件 resource,并在 build 标签内进行设置

  • 使用步骤:

    1. 设置项目文件夹目录:directory 标签
    2. 设置扫描文件类型:includes 标签
    3. 设置是否启用过滤器(使用“上面”定义的文件也纳入处理范畴,处理后的文件也放入 .class 文件):filtering 标签
      • 一般使用 false
    <build>
      <!--资源插件-->
      <resources>
        <resource>
            <!--所在的目录-->
            <directory>src/main/java</directory>
            <!--扫描文件类型-->
          <includes>
              <!--包括目录下的.properties,.xml 文件都会扫描到-->
              <include>**/*.properties</include>
              <include>**/*.xml</include>
          </includes>
            <!-- filtering 选项 false 不启用过滤器-->
            <filtering>false</filtering>
        </resource>
      </resources>
    </build>