什么是Maven

  1. 项目的自动构建,帮助开发人员做项目代码的编译,测试, 打包,安装,部署等工作。
  2. 管理依赖(管理项目中使用的各种jar包)。

如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。
以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。
而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。

Maven获取与安装

下载Maven

在 【Maven官方地址】中下载Maven

安装Maven

  1. 确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录
  2. 解压缩下载的Maven压缩包 ,把解压后的文件放到一个目录中。 目录的路径不要有中文,不要有空格。
  3. 把maven安装目录下的bin的路径添加到环境变量Path中
  4. 测试maven的安装。 在命令行 win+r cmd 中执行 mvn -v

image.png

Maven约定的目录结构

maven项目使用的大多人 遵循的目录结构。 叫做约定的目录结构。
一个maven项目是一个文件夹。 比如项目叫做HelloMaven

  1. HelloMaven 项目文件夹
  2. \src
  3. \main 叫做主程序目录(完成项目功能的代码和配置文件)
  4. \java 源代码(包和相关的类定义)
  5. \resources 配置文件
  6. \test 放置测试程序代码的(开发人员自己写的测试代码)
  7. \java 测试代码的(junit
  8. \resources 测试程序需要的配置文件
  9. \pom.xml maven的配置文件, 核心文件

maven的使用方式:

  1. maven可以独立使用: 创建项目,编译代码,测试程序,打包,部署等等
  2. maven和idea一起使用:通过idea借助maven,实现编码,测试,打包等等

    pom.xml

    POM: Project Object Model 项目对象模型, maven把项目当做模型处理。 操作这个模型就是操作项目。
    maven通过pom.xml文件实现 项目的构建和依赖的管理。 ```xml <?xml version=”1.0” encoding=”UTF-8”?>
  1. <!-- pom模型的版本, 就是4.0.0 -->
  2. <modelVersion>4.0.0</modelVersion>
  3. <!-- 坐标 -->
  4. <groupId>com.bjpowernode</groupId>
  5. <artifactId>ch01-maven</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. <properties>
  8. <java.version>1.8</java.version>
  9. <maven.compiler.source>1.8</maven.compiler.source>
  10. <maven.compiler.target>1.8</maven.compiler.target>
  11. </properties>

  1. <a name="IaP8v"></a>
  2. # 坐标
  3. 坐标组成是 `<groupId>`, `<artifactId>`, `<version>`。 <br />坐标作用:确定资源的,是资源的唯一标识。 在maven中,每个资源都是坐标。 坐标值是唯一的。简称叫`gav`
  4. ```xml
  5. <groupId>com.abcdefg</groupId>
  6. <artifactId>ch01-maven</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  • groupId:组织名称,代码。 公司,团体或者单位的标识。 这个值常使用的公司域名的倒写。 如果项目规模比较大, 也可以是 域名倒写+大项目名称。例如:百度的阿波罗无人车项目 com.baidu.appollo
  • artifactId:项目名称, 如果groupId中有项目, 此时当前的值就是子项目名。 项目名称是唯一的。
  • version:版本, 项目的版本号, 使用的数字。 三位组成。 例如 主版本号.次版本号.小版本号, 例如: 5.2.5。注意:版本号中有-SNAPSHOT, 表示快照,不是稳定的版本。
  • packaging:项目打包的类型, 有jar ,war, ear, pom等等,不写默认是jar

项目使用gav:

  1. 每个maven项目,都需要有一个自己的gav
  2. 管理依赖,需要使用其他的jar ,也需要使用gav作为标识。

搜索坐标的地址: https://mvnrepository.com/

依赖dependency

依赖:项目中要使用的其他资源(jar),比如需要使用mysql数据库,就要使用mysql的驱动。
可以用maven管理依赖。
需要在pom.xml文件中,使用dependencies 和dependency, 还有gav 完成依赖的说明。

注:
一个pom.xml文件在project节点下声明一个dependencies节点,然后再dependencies节点里面可以声明多个dependency节点,每个dependency节点下面就是你要引用的jar依赖的gav坐标。
maven使用gav作为标识,从互联网下载依赖的jar。 下载到你的本机上。 由maven管理项目使用的这些jar

  1. <dependencies>
  2. <!-- 日志 -->
  3. <dependency>
  4. <groupId>log4j</groupId>
  5. <artifactId>log4j</artifactId>
  6. <version>1.2.17</version>
  7. </dependency>
  8. <!-- mysql驱动 -->
  9. <dependency>
  10. <groupId>mysql</groupId>
  11. <artifactId>mysql-connector-java</artifactId>
  12. <version>5.1.16</version>
  13. </dependency>
  14. </dependencies>

依赖范围

依赖范围:使用表示依赖的范围。
依赖范围表示: 这个依赖(jar和里面类)在项目构建的那个阶段起作用。
依赖范围

  • compile:默认, 参与构建项目的所有阶段
  • test:测试,在测试阶段使用, 比如执行mvn test会使用junit 。
  • provided:提供者。 项目在部署到服务器时,不需要提供这个依赖的jar , 而是由服务器这个依赖的jar包。明显的是servlet 和jsp 依赖

    仓库

    仓库是存东西的,maven的仓库存放的是:
  1. maven工具自己的jar包。
  2. 第三方的其他jar, 比如项目中要使用mysql驱动。
  3. 自己写的程序,可以打包为jar , 存放到仓库。

    仓库分类

    本地仓库

    默认路径,是你登录操作系统的账号的目录中/.m2/repository

    修改本地仓库的位置

    修改maven工具的配置文件(maven的安装路径\conf\setting.xml)
    步骤:

  4. 创建一个目录,作为仓库使用。 目录不要有中文和空格。 目录不要太深。 例如: C:/maven/repository

  5. 修改setting.xml文件,<localRepository>C:/maven/repository</localRepository>,localRepository是settings标签的直接子标签
  6. 把之前的本地仓库的内容拷贝到这里面去,或者重新下载

    远程仓库

  7. 中央仓库: 一个ftp服务器, 存放了所有的资源。

  8. 中央仓库的镜像: 就是中央仓库的拷贝。 在各大主要城市都有镜像。
  9. 私服:在局域网中使用的。 私服就是自己的仓库服务器。 在公司内部使用的

maven使用仓库: maven自动使用仓库, 当项目启动后, 执行了maven的命令, maven首先访问的是本地仓库, 从仓库中获取所需的jar, 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像。
image-20201016114322189.png

镜像仓库

中央仓库下载慢,可以添加国内的镜像仓库

添加阿里云镜像,把这段标签,放在Maven的setting.xml文件的mirrors标签下面

  1. <mirror>
  2. <id>alimaven</id>
  3. <name>aliyun maven</name>
  4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5. <mirrorOf>central</mirrorOf>
  6. </mirror>

maven的生命周期

maven的生命周期: 项目构建的各个阶段。 包括:

  • 清理
  • 编译
  • 测试
  • 报告
  • 打包
  • 安装
  • 部署

    命令与插件

    maven项目根目录,pom.xml同级目录下打开命令行,可以输入下面的命令

    mvn clean

    清理命令, 作用删除以前生成的数据, 删除target目录。
    使用的插件:

    • maven-clean-plugin

      mvn compile

      编译命令,执行的代码编译, 把src/main/java目录中的java代码编译为class文件
      同时把class文件拷贝到 target/classes目录。 这个目录classes是存放类文件的根目录(也叫做类路径,classpath)
      使用的插件:

    • maven-compiler-plugin:编译代码的插件

    • maven-resources-plugin:资源插件, 处理文件的。 作用是把src/main/resources目录中的文件拷贝target/classes目录中

      mvn test-compile

      编译命令, 编译src/test/java目录中的源文件, 把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到 test-clasess目录
      使用的插件:

    • maven-compiler-plugin:编译代码的插件

    • maven-resources-plugin资源插件, 处理文件的

mvn test

测试命令, 作用执行 test-classes目录的程序, 测试src/main/java目录中的主程序代码是否符合要求
使用的插件:

  • maven-surefire-plugin

    mvn package

    打包,作用是把项目中的资源class文件和配置文件都放到一个压缩文件中, 默认压缩文件是jar类型的。 web应用是war类型, 扩展是jar,war的
    使用的插件:

  • maven-jar-plugin:执行打包处理。 生成一个jar扩展的文件, 放在target目录下。打包的文件包含的是 src/main目录中的所有的生成的class和配置文件和test无关

    mvn install

    把生成的打包的文件 ,安装到maven仓库
    使用的插件:

  • maven-install-plugin

    自定义配置插件

    在pom.xml文件中, build标签中。设置插件

    1. <!-- 设置构建项目相关的内容 -->
    2. <build>
    3. <plugins>
    4. <!-- 设置插件 -->
    5. <plugin>
    6. <groupId>org.apache.maven.plugins</groupId>
    7. <artifactId>maven-compiler-plugin</artifactId>
    8. <version>3.8.1</version>
    9. <configuration>
    10. <source>1.8</source> <!-- 指定编译代码的jdk版本 -->
    11. <target>1.8</target> <!-- 运行java程序使用的jdk版本-->
    12. </configuration>
    13. </plugin>
    14. </plugins>
    15. </build>

    常用设置

    properties基础设置

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

    全局变量

    在properties定义标签,这个标签就是一个变量, 标签的文本就是变量的值。
    使用全局变量表示 多个依赖使用的版本号。

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

    1. <properties>
    2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    3. <maven.compiler.source>1.8</maven.compiler.source>
    4. <maven.compiler.target>1.8</maven.compiler.target>
    5. <!--自定义变量-->
    6. <spring.version>5.2.5.RELEASE</spring.version>
    7. <junit.version>4.11</junit.version>
    8. </properties>
  2. 依赖使用全局变量,语法 ${变量名} ```xml

    org.springframework spring-core ${spring.version}

org.springframework spring-web ${spring.version}

  1. <a name="EjesZ"></a>
  2. # 使用资源插件
  3. 处理的配置文件的信息, maven默认处理配置文件<br />①:maven会把src/main/resources目录中的文件, 拷贝到target/classes目录下<br />②:maven只处理src/main/java目录中的 .java文件,把这些java文件编译为class,拷贝到 target/classes目录中。 不处理其他文件。
  4. ```xml
  5. <build>
  6. <!--资源插件
  7. 告诉maven把 src/main/java目录中的 指定扩展名的文件 拷贝到 target/classes目录中。
  8. -->
  9. <resources>
  10. <resource>
  11. <directory>src/main/java</directory><!--所在的目录-->
  12. <includes>
  13. <!--包括目录下的.properties,.xml 文件都会扫描到-->
  14. <include>**/*.properties</include>
  15. <include>**/*.xml</include>
  16. </includes>
  17. <!-- filtering 选项 false 不启用过滤器, *.property 已经起到过
  18. 滤的作用了 -->
  19. <filtering>false</filtering>
  20. </resource>
  21. </resources>
  22. </build>

Maven和IDEA的集成

在IDEA中设置Maven环境

idea中有一个自带的maven。 我们要让idea使用自己安装的maven
image.png
image.png

设置项: -DarchetypeCatalog=internal

对新建的项目或者导入的项目也使用同样的maven设置,进去同样的设置
image.png

创建基于Maven的普通java项目

image.png
image.png
image.png

创建完成

创建完成后结构如下
image.png
第一次创建要下载很多东西,速度真的慢,创建了半个小时。不过第一次下载的东西都放在本地仓库了,之后创建就不需要下载这么多了。
image.png
如果要加上resources目录结构,可以直接新建文件夹右键该文件夹

image.png
image.png
image.png

报错

应该是Maven版本问题,之前用的是最新版本,3.8.5,才出几天的版本,换个低版本的,3.8.1去年版本,就好了
image.png

单元测试junit

junit是一个单元测试的工具, 在java中经常使用。

  • 单元:在java中指的是方法。 一个方法就是一个单元, 方法是测试的最小单位。
  • 作用:使用junit去测试方法是否完成了要求。 开发人员自测。

明白了一点,以前一直觉得要测试一段代码有没有问题,运行代码,断点调试就行了。根本没必要用单元测试。 后来写API,有些底层的方法需要测试,我需要一层一层调用好了,然后传参数进去。挺麻烦的,如果能直接调用底层的方法就好了,这就是单元测试,直接运行目标方法

使用单元测试

  1. 加入junit依赖

    1. <dependency>
    2. <groupId>junit</groupId>
    3. <artifactId>junit</artifactId>
    4. <version>4.11</version>
    5. <scope>test</scope>
    6. </dependency>
  2. 在src/test/java 目录中创建测试类文件,写测试代码

单元测试使用的建议:

  1. 测试类的定义, 名称一般是Test+要测试的类名称
  2. 测试类它的包名和要测试的类包名一样
  3. 在类中定义方法,要测试代码

image.png
image.png

IDEA中Maven工具窗口

image.png

Maven导入模块到IDEA

image.png
image.png