Maven

简介

Maven 项目架构管理工具(构建工具)

我们目前用来就是方便导入 jar 包的!

为什么要学习它?

  1. 在 JavaWeb 中 ,需要使用大量的 jar 包,我们需要手动去导入。
  2. 如何能够让一个东西自动帮我导入和配置这个 jar 包。 由此,Maven 应运而生

Maven 的核心思想:约定大于配置

什么是约定大于配置呢?

​ Maven 提供了一套科学的默认配置,它要求你遵循这些配置约定,然后它就会帮你处理日常的事务 compile, test, package等等。使用 Maven 的时候,你应该尽可能遵循它的配置约定,一方面可以简化配置,另一方面可建立起一种标准,减少交流学习成本。一旦你习 惯了这种约定,你得到的回报是巨大的。反之,恣意的做自定义,想要 Maven 听你的话,那么你觉得 Maven 不爽,Maven 也会认为你不爽。

​ 简单来说,maven 默认会给你整个科学的配置,你觉得这个文件放在应该放的文件夹下不好看,放在了别的文件夹下,maven 是不会 鸟你的,不会给你导出的,这之后就要( build 标签,手动描述如何来编译及打包项目)

所以呢,

  • 有约束,不要去违反

  • Maven 会规定好你改如何去编写我们的 java 代码(目录结构),必须按照这个规范来!


1 下载安装 Maven

  1. 下载完成后,解压即可:官网
  2. 在我们的系统环境变量中
配置环境变量:

1. M2_HOME    maven 目录下的 bin 目录

2. MAVEN_HOME    maven 的目录

3. 在系统的 path 中配置 %MAVEN_HOME%\bin
  1. 测试 Maven 是否安装成功。 cmd --> mvn -version (mvn bin目录小的可执行文件 )

2 阿里云镜像

  • 镜像:mirrors
    • 作用:加速我们的下载
  • 国内建议使用阿里云的镜像
 <mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 </mirror>

3 本地仓库

在本地的仓库,-----那肯定有远程仓库 ,就是*仓库。

建立一个本地仓库:localRepository

在 setting.xml 中设置一下

<localRepository>D:\ITSoft\maven\repository</localRepository>

Maven 的核心概念

① 约定的目录结构

maven 项目使用的大多数人遵循的目录结构。 叫做约定的目录结构。

一个 maven 项目是一个文件夹。 比如项目叫做 Hello

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

maven 的使用方式:

1)maven 可以独立使用: 创建项目,编译代码,测试程序,打包,部署等等

2)maven 和 idea一起使用:通过idea借助maven,实现编码,测试,打包等等

② POM

POM: Project Object Model (项目对象模型), maven 把项目当做模型处理。 操作这个模型就是操作项目。

maven 通过 pom.xml 文件实现 项目的构建和依赖的管理。 是 maven 的核心配置文件。

<?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>

<!--  这里就是我们刚才配置的 GAV 坐标-->
  <groupId>org.example</groupId>
  <artifactId>javaweb02</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--  package :项目打包的方式
        jar:java 应用
        war:javaweb应用-->
  <packaging>war</packaging>


<!--就是一些名称,可以删,没啥用-->
  <name>javaweb02 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>


<!--  配置-->
  <properties>
<!--    项目的默认构建编码-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--    编码版本-->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>


<!--  项目依赖-->
  <dependencies>
<!--  具体的 jar 文件  -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

<!--    maven的高级之处就在于,他会帮你导入 jar 包所依赖的其它 jar 包-->
  </dependencies>


<!--  项目构建用的东西-->
  <build>
      
  </build>
</project>

③ 坐标

坐标组成 :groupid, artifiactId, version。

作 用:确定资源的,是资源的唯一标识。 在 maven 中,每个资源都是坐标。 坐标值是唯一的。简称叫 gav

项目使用 gav:每个 maven 项目,都有一个自己的 gav, 当需要使用其他的 jar ,也要使用 gav 作为标识。

  <groupId>com.kang</groupId>
  <artifactId>maven-01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

groupId: 组织名称,代码。 公司,团体或者单位的标识。 这个值常使用的公司域名的倒写。
         例如:学校的网站 www.bjwl.com,  groupId: com.bjwl

         如果项目规模比较大, 也可以是 域名倒写+大项目名称。
	     例如: www.baidu.com ,  无人车: com.baidu.appollo
artifactId:项目名称, 如果groupId中有项目, 此时当前的值就是子项目名。 项目名称是唯一的。
version:版本, 项目的版本号, 使用的数字。 三位组成。 例如 主版本号.次版本号.小版本号, 例如: 5.2.5。
         注意:版本号中有-SNAPSHOT, 表示快照,不是稳定的版本。      
   
packaging 项目打包的类型, 有jar ,war, ear, pom等等 默认是jar

④ 依赖管理

依赖:项目中要使用的其他资源(jar)。

格式:

<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> 

maven 使用 gav 作为标识,从互联网下载依赖的 jar。 下载到你的本机上。 由 maven 管理项目使用的这些 jar.

⑤ 仓库管理

仓库就是是存东西的,maven 的仓库存放的是:

  1. maven 工具自己的 jar 包。
  2. 第三方的其他 jar, 就是我们项目中,mysql,junit,mybatis 等
  3. 自己写的程序,可以打包为jar 。 存放到仓库。

仓库的分类:

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

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

    C:\Users\NING MEI\.m2\repository

  2. 远程仓库: 需要通过联网访问的

  3. 私服:在局域网中使用的。 私服就是自己的仓库服务器, 在公司内部使用的。

​ maven 使用仓库: maven 自动使用仓库, 当项目启动后, 执行了maven 的命令, maven 首先访问的是本地仓库, 从仓库中获取所需的 jar, 如果本地仓库没有 ,需要去远程仓库找。

Maven

⑦ 插件和命令

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

命令: 执行 maven 功能是 由命令发出的。 比如 mvn compile

命令 作用
mvn clean 清理命令, 作用删除以前生成的数据, 删除 target 目录。
mvn compile 编译命令,执行的代码编译, 把 src/main/java 目录中的 java 代码编译为 class 文件。同时把class文件拷贝到 target/classes目录。 这个目录classes是存放类文件的根目录(也叫做类路径,classpath)
mvn test-compile 编译命令, 编译 src/test/java 目录中的源文件, 把生成的 class 拷贝到 target/test-classes 目录。同时把 src/test/resources 目录中的文件拷贝到 test-clasess目录
mvn test 测试命令, 作用执行 test-classes 目录的程序, 测试 src/main/java 目录中的主程序代码是否符合要求。
mvn package 打包,作用是把项目中的资源 class 文件和配置文件都放到一个压缩文件中, 默认压缩文件是 jar 类型的。 web 应用是 war 类型, 扩展是 jar,war 的。
mvn install 把生成的打包的文件 ,安装到 maven 仓库。

⑧ 继承

一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目 父项目

​ 多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中, 子项目通过继承得到这些依赖, 这样也更好的来管理。

3 在 idea 中使用 Maven

  1. 启动 idea
  2. 创建一个 maven

Maven

next

Maven

Maven

next

Maven

Finish

Maven

观察 maven 出现了什么东西

- idea 中的 maven 设置

注意事项:idea 中的 maven 创建成功之后,看一眼 maven 的配置,

Maven

ok了!这就是一个 web 项目了

创建一个普通的 maven 项目

不点 使用 maven 模板

记得看一下 maven 配置

Maven

这个只有在 Web 应用下才会有!

Maven

在 idea 中标记文件夹功能

Maven

或者

Maven

两种方法都可以,在需要创建特殊目录的时候可以使用。

- maven 侧边栏的使用

Maven

- idea 中操作

生成目录树

Maven

Maven


常用设置

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>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <!--自定义变量-->
  <spring.version>5.2.5.RELEASE</spring.version>
  <junit.version>4.11</junit.version>
</properties>



<!--使用全局变量, 语法 ${变量名}-->
<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>

资源插件

处理的配置文件的信息, maven默认处理配置文件

① maven 会把 src/main/resources 目录中的文件, 拷贝到target/classes目录下

② maven 只处理 src/main/java 目录中的 .java文件,把这些 java 文件编译为 class,拷贝到 target/classes 目录,不处理其他文件。

<build>
  <!--资源插件
      告诉 maven 把 src/main/java 目录中的 指定扩展名的文件 拷贝到 target/classes目录中。
  -->
  <resources>
    <resource>
      <directory>src/main/java</directory><!--所在的目录-->
      <includes>
      <!--包括目录下的.properties,.xml 文件都会扫描到-->
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
        <!--  filtering 选项 false 不启用过滤器, *.property 已经起到过
        滤的作用了 -->
      <filtering>false</filtering> <!-- 过滤开启,让这些目录下的文件可以被导出 无所谓-->
    </resource>
  </resources>
</build>

常见问题

1. maven 资源导出问题

什么是资源导出问题?

​ 在 Maven 项目中,资源配置文件默认是放在 resources 目录下的。但有时我们在编写项目时,配置文件可能会被我们放置的别的目录,Maven 由于它的约定大于配置,所以默认的 maven 项目在构建编译时不会把我们其他目录下的配置文件导出到 target 目录中,从而导致配置文件无法导出或者生效的问题。

maven 由于它的约定大于配置,我们之后可能遇到我们写的东西 ,无法被导出或者生效的问题。。


​ 这个问题在 mybatis 第一个程序就遇见了,当我们把 UserMapper.xml 从 resource 目录下,移到 dao 目录下,maven 是约定大于配置的,所以它会报一个错,找不到 UserMapper.xml 。这个就是资源导出问题,

解决方法就是手动配置资源过滤。

解决方案:在项目的 pom.xml 文件中手动配置资源过滤,让它把 src/main/java 目录下的 .properties 和 .xml文件也能够被导出。

如下:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

2. idea 每次都要重复配置

idea 中有个全局配置和项目配置,每次都要重复配置, 1 、你肯定是在项目中配置了。再次创建的时候当然不管用了,这个需要在全局配置一下。

Maven

maven 默认 web 项目中 web.xml 版本问题

Maven

解决: 替换为 webapp4.0 版本 和 Tomcat 一致。(可以再 Tomcat 中找:tomcat\apache-tomcat-9.0.56\webapps\ROOT\WEB-INF)

如下:web.xml

<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"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

</web-app>

3. Build 时会发生...

Maven

解决:

1.直接在设置里面改,File -> Project Structure... project,Moudle 全部改为 8settings - > java compiler 改为 8

2.打开pop.xml文件.修改编译器版本为 1.8 .然后刷新 Maven。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

4. project 标签报红线

使用 IDEA,pom.xml 中 project 报错说找不到本地 jar 包。大半是因为网络状态不好 jar 包未下载完全并自动解析成功

Maven

解决:

  1. 等一下
  2. 删掉未下好的,手动添加

5. maven 无法自动下载依赖

解决方案:

  1. 看配置了*仓库没
  2. 看网络是否通畅
  3. 换个版本试一试
上一篇:.net基础—反射


下一篇:git全局配置及文件改变状态详解