Maven学习总结

Posted AC_Jobim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven学习总结相关的知识,希望对你有一定的参考价值。

一、Maven介绍

  • maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
  • Maven 是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用,Maven 是一款在大型项目开发过程中不可或缺的重要工具。

二、安装Maven环境

2.1 mac环境安装

  1. maven下载地址:http://maven.apache.org/download.cgi
    在这里插入图片描述

  2. 将解压好的文件放到/usr/local目录下面
    在这里插入图片描述

  3. 配置环境变量,首先去看看 ~/ 目录下面有没有 .bash_profile文件

    1. 要是没有 咱们就去创建一个

      touch ~/.bash_profile
      
    2. 如果有的话 咱们就直接进入

      vi ~/.bash_profile
      
    3. 之后配置一下环境变量

      export M=$PATH:/usr/local/apache-maven-3.3.9/bin
      
    4. ESC一下 然后 :wq保存一下,然后在终端让命令生效一下

      source ~/.bash_profile
      
  4. 测试一下环境变量是否已经配置完成。在终端输入一个 mvn -v。如果出现下图则配置成功
    在这里插入图片描述

2.2 windows环境安装

  1. 下载并解压 maven 安装程序:

    子目录 bin :执行程序,主要是mvn.cmd
    conf :maven工具本身的配置文件 settings.xml

  2. 配置环境变量

    在系统的环境变量中,指定一个MAVEN_HOME的名称, 指定它的值是maven工具安装目录,bin之前的目录
    在这里插入图片描述

    系统变量:path=%MAVEN_HOME%/bin;
    在这里插入图片描述

  3. 验证,新的命令行中,执行mvn -v

    出现如下内容,maven安装,配置正确。
    在这里插入图片描述

三、Maven 的核心概念:

3.1 Maven工程约定目录结构

maven约定的目录结构, 约定是大家都遵循的一个规则。

以Hello的maven项目为例:

Hello/
  ---/src
  ------/main           #放你主程序java代码和配置文件
  ----------/java       #你的程序包和包中的java文件
  ----------/resources  #你的java程序中要使用的配置文件

  ------/test  			#放测试程序代码和文件的(可以没有)
  ----------/java       #测试程序包和包中的java文件
  ----------/resources  #测试java程序中要使用的配置文件
  ---pom.xml            #Maven工程的核心配置文件

在这里插入图片描述

3.2 POM文件

  1. 基本信息

     modelVersion Maven: 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0
     groupId:	组织 id,一般是公司域名的倒写。 格式可以为:
     			1.域名倒写。 例如 com.baidu
     			2.域名倒写+项目名。例如 com.baidu.appolo
     version:	项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT
     			version 使用三位数字标识,例如 1.1.0
     packaging:项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar
    

    注意:groupId 、artifactId 、version 三个元素生成了一个Maven 项目的基本坐标,在众多的maven 项目中可以唯一定位到某一个项目。坐标也决定着将来项目在仓库中的路径及名称。

  2. 依赖 dependencies 和dependency

    Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称为依赖,使用标签 dependency 来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven 把所有的 jar 包也都视为项目存在了。

  3. 配置属性 properties

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

  4. 构建build

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

  5. 继承parent

    在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机制,用 parent 声明要继承的父工程的 pom 配置。

  6. 聚合modules

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

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,
  虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成,
   如com.liu.learning,maven会将该项目打成的jar包放本地仓库下的:/com/liu/learning 目录下下-->
    <groupId>com.liu.learning</groupId>
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>HelloWorld01</artifactId>
    <!-- 版本号 -->
    <version>0.0.1-SNAPSHOT</version>
    <!--项目的名称, Maven产生的文档用 -->
    <name>HelloWorld01</name>
    <!--项目产生的构件类型,例如jar、war、ear、pom。 -->
    <packaging>jar</packaging>
    <!--项目描述 -->
    <description>hello world</description><!-- 统一JDK版本 -->
    <profiles>
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles><dependencies>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!-- jar包的作用范围,相关知识会摘出来单独讲解 -->
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--  下边还是配置远程仓库镜像  -->
    <!--  如果你不想在conf.xml配置国内镜像,又想高速下载jar包时,那你就只能每次都手动加入如下配置  -->
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <!--如果你只配置了repositories,你会发现在下载依赖时,一部分从阿里云下载,
    一部分(插件部分)还是从默认的仓库下载,所以你还要配置插件的远程仓库地址,
    那么这个插件又是什么东西呢,可以看下方图片粗略了解下-->
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>

3)仓库的使用,maven仓库的使用不需要人为参与。

	开发人员需要使用mysql驱动--->maven首先查本地仓库--->私服--->镜像--->中央仓库

3.3 仓库

  • 在 Maven 的术语中,仓库是一个位置(place)
  • Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库
  • 在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件
  • Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方
  • Maven 仓库有三种类型 :
    • 本地(local)
    • 远程(remote)

本地仓库

  • Maven 的本地仓库,在安装 Maven 后并不会创建 ,它是在第一次执行 maven 命令的时候才被创建

  • 运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件

  • 默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录

  • 修改本地仓库的位置,Maven的conf目录中的settings.xml文件:
    在这里插入图片描述

远程仓库

分为为全世界范围内的开发人员提供服务的中央仓库、为全世界范围内某些特定的用户提供服务的中央仓库镜像、为本公司提供服务自己架设的私服。中央仓库是maven默认的远程仓库,其地址是:https://repo.maven.apache.org/maven2/

  • 中央仓库,包含了绝大多数流行的开源Java构件,以及源码、作者信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载得到。
  • 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。

仓库搜索顺序

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库 :

maven首先查本地仓库--->私服--->镜像--->中央仓库

配置阿里云仓库

Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:

<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
</mirrors>

3.4 maven的常用命令和插件

maven的常用命令:

Maven 提供一个项目构建的模型,把编译、测试、打包、部署等都对应成一个个的生命周期阶段,并对每一个阶段提供相应的命令,程序员只需要掌握一小堆命令,就可以完成项目的构建过程。

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

在这里插入图片描述

参考博客:https://www.cnblogs.com/xdp-gacl/p/4051690.html

maven的插件:

maven的插件: maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。
在这里插入图片描述

四、IDEA中使用 Maven

  • idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自己安装的maven, 让idea指定maven安装位置等信息
    在这里插入图片描述

  • 推荐配置:设置maven在不联网的情况下使用本地插件

    一般使用maven为我们提供好的骨架时,是需要联网的,配置这个,可以在没有网路的情况下,我们可以正常创建工程,并从之前已经使用过的工程中找到相应的骨架。

    输入内容:-DarchetypeCatalog=internal
    在这里插入图片描述

  • 创建maven版java工程
    在这里插入图片描述

  • 创建maven版web项目
    在这里插入图片描述

  • 在idea中操作maven项目
    在这里插入图片描述

五、maven常用设置

5.1 依赖的范围

依赖的范围主要包括:compiletestprovided

在这里插入图片描述

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope><!--该依赖只对测试程序有效-->
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope><!--该依赖不参与打包和部署-->
    </dependency>
  </dependencies>

maven的属性设置
设置maven的常用属性
在这里插入图片描述

5.2 maven的全局变量

自定义的属性:

1.在<properties> 通过自定义标签声明变量(标签名就是变量名)
2.在pom.xml文件中的其它位置,使用 ${标签名} 使用变量的值

使用场景:自定义全局变量一般是定义 依赖的版本号, 当你的项目中要使用多个相同的版本号,先使用全局变量定义, 再使用${变量名}
在这里插入图片描述

5.3 指定资源位置

在build标签中进行配置:

<build>
  <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. 默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中。对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中
  2. 当我们执行java程序时,需要用到src/main/java目录中的文件,需要告诉maven在mvn compile src/main/java目录下的程序时,需要把文件一同拷贝到target/classes目录中。此时就需要在<build>中加入<resources>

以上是关于Maven学习总结的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习总结_15_定制Mybatis自动代码生成的maven插件

线程学习知识点总结

Maven学习总结(60)—— Maven 作用域 Scope 属性详解

Maven学习总结(60)—— Maven 作用域 Scope 属性详解

Maven学习总结

Maven学习总结(一副本)——Maven配置和搭建