Maven 基础知识总结笔记

Posted IT_Holmes

tags:

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

1. 为什么要用 Maven?


效果图:


使用maven的优点:

  • 借助于maven就可以将一个项目拆分成多个工程。
  • 借助maven可以将jar包仅仅保存在 " 仓库 "中,有需要使用的工程引用这个文件接口,并不需要真的把jar包复制过来。
  • 借助于maven可以以一种规范的方式下载jar包,不用自己去网上下载了,因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在了maven的中央库中的。
  • 借助maven会自动将被依赖的jar包导入进来。

2. Maven 的 概述

Maven是一款服务于Java平台的自动化构建工程。


自动化构建工程中的 “构建” 是什么意思?

以"Java源文件",“框架配置文件”,“JSP”,“HTML” ,“图片” 等资源为 " 原材料 “,去” 生产 "一个可以运行的项目的过程。整体上就是一个编译,部署,搭建的过程

下图是一个创建Servlet动态web工程的一个构建过程:


提一句关于eclipse的一个小知识:

eclipse中的navigator视图是专门用来查看字节码的。平时我们通过Window =》 show view =》others 直接搜索就能打开了。


运行环境里面有我们常用的jar包。

3. 安装 Maven核心程序


1.检查JAVA_HOME环境变量:


2.解压Maven核心程序的压缩包

(去官网下载maven核心压缩包,注意要将解压的maven文件放到没有中文路径的磁盘下。)


3.配置maven的环境变量

  • MAVEN_HOME或M2_HOME(这个不太清楚,可能为了兼容2版本)
  • path路径,在maven_home路径上加个bin就行了。
  • mvn -v来检验是否配置成功,并且环境变量配置后,命令行窗口要重新开一下。

4. Maven 决定的目录结构


创建约定的目录的结构:

根目录:工程名。
src目录:源码。
pom.xml文件:Maven工程的核心配置文件。
main目录:该目录用来写主程序。
test目录:用来测试程序的。
java目录:存放Java源文件。
resources目录:存放框架或其他工具的配置文件。



为什么要遵守约定的目录结构呢?

Maven要负责我们这个项目的自动化构建,以编译为例,Maven要想自动进行编译,那么它必须知道Java源文件保存在哪里,换句话说就是一个固定格式而已。

5. 关于Maven联网的问题


Maven关于联网的问题:(Maven的执行过程)

1.Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。

2.当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。

3.本地仓库的默认位置: 当前用户系统的家目录.m2\\repository

4.Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载。

5.如果此时无法连接外网,则构建失败。


如何修改默认本地仓库的位置?

默认的仓库位置是c:\\Users\\当前用户.m2\\repository路径

  • 首先,打开 Maven解压目录\\conf\\setting.xml文件。
  • 找到localRepository标签。
  • 然后配置好自己的路径就好了。

6. Maven POM


POM,全称Project Object Model 项目对象模型。

其实,有点像之前比较熟悉的DOM,全称 :Document Object Model 文档对象模型。


pom.xml 是Maven工程的核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。

7. Maven 坐标

比较一下数学中坐标和Maven的坐标:


数学中的坐标:

在平面上,使用X,Y两个向量可以唯一的定位平面中的任何一个点。
在空间上,使用X,Y,Z三个向量可以唯一的定位空间中的任何一个点。


Maven的坐标:

使用下面三个向量在仓库中唯一定位一个Maven工程。

1.groupid:公司或组织域名倒序+项目名。

<groupid>com.demo.maven</groupid>

2.artifactid:模块名称。

<artifactid>model_name</artifactid>

3.version:版本

<version>1.0.0.RELEASE</version>

所以上面也统称为Maven的gav,也就是坐标。

而这个坐标的作用就是可以映射出我们想要的jar位置在本机的哪里!

就比如上面的内容,对应的目录如下:

com/demo/maven/model_name/1.0.0.RELEASE/model_name-1.0.0.RELEASE.jar

格式就是这样来的,记住就行。

8. Maven 仓库


Maven的仓库有两个:

  • 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务。

  • 远程仓库有三种:
    1.私服: 搭建在局域网环境中,为局域网范围内的所有Maven工程提供服务。Nexus私服是类似于Tomcat一样,它也算是解决连接外网下载Maven的一种方式。

    2.中央仓库:架设在Internet互联网上,为全世界所有Maven工程服务。

    3.中央仓库镜像: 就是为了分担中央仓库的流量,提升用户访问速度。


仓库中保存的内容:

  • Maven自身所需要的插件。
  • 第三方框架或工具的jar包。
  • 我们自己开发的Maven工程。

10. Maven 命令构建过程


执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。与构建过程相关:编译,测试,打包…

常用命令:

  • mvn clean:清理编译后的东西(例如:Target目录)。
  • mvn compile:编译主程序。
  • mvn test-compile: 编译测试程序。
  • mvn test: 执行测试。
  • mvn package: 打包。

需要注意,我们执行命令需要在pom.xml所在的目录下执行。

不同的命令会产生对应的不同文件要注意!


我们使用mvn compile之后,会生成一个target文件,里面还会有两个文件:


一个是存储生成的字节码,一个是存储maven的状态文件(不确定)。

之后我们使用mvn test 测试时,还会在target文件中生成另外两个文件:


一个是存储报告的文件,一个是存储测试的字节码文件。

再然后我们执行mvn package来进行打包,这个是后target文件还会生成两个文件:

其中jar包中就包含了程序的字节码。

需要注意,上面是有先后顺序的,必须编译后,测试,测试后才能打包!


在让后,我们使用mvn install 命令将我们打包好的东西放到仓库中。

我们之前groupid定义的路径就是我们放置仓库的路径,也和mvn的坐标gav对应起来。

11. 使用Maven插件来创建工程(了解,一般用不上)



像通过上面的命令来操作的直接通过cmd命令创建工程。

12.使用idea来创建Maven工程


首先,我们先进入setting =》搜索maven,设置好maven路径和maven的setting.xml配置文件,再配置好本地仓库路径。


上面配置好了,我们就可以通过idea来创建。

第一步:点击右上角的符号来创建。

第二步:创建一个maven项目。


第三步:设定好名字和坐标!

第四步:设定结构,对应的结构要设定好!

这样一个标椎的maven工程就创建出来了。


我们之前mvn命令对应的在idea中也有:


直接双击就运行对应的命令。


maven的debug运行如何设置呢?

首先,点击edit Configurations…

然后添加一个maven:


之后我们就可以debug,打断点来调试测试了:

13. Maven 使用idea的模板(骨架)创建项目


13.1 使用模板(骨架)创建java项目



就是在创建的时候记得添加archetype中的quickstart。创建后可能缺少一些结构什么resource目录,可以自行添加并且声明文件类型。。

13.2 使用模板(骨架)创建web项目


同样,web项目就要添加webapp骨架。


也是缺少一些结构需要自己添加并且声明文件类型。

14. Maven tomcat插件安装与web启动


通过maven来安装tomcat插件,步骤如下:

第一步:创建一个webapp工程,设定好结构等等。


第二步:配置pom.xml文件如下:(重点看build中的插件内容)

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <packaging>war</packaging>

  <name>WebAppTest01</name>
  <groupId>com.test</groupId>
  <artifactId>WebAppTest01</artifactId>
  <version>1.0-SNAPSHOT</version>

<!-- 我们在Maven restor官网上查询org.apache.tomcat.maven 下的 Apache Tomcat Maven Plugin :: Tomcat 7.x插件依赖,得到tomcat的坐标。 -->

<!--构建-->
  <build>
  <!--添加插件-->
    <plugins>
      <!--具体插件配置-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
      </plugin>
    </plugins>
  </build>

</project>

第三步:配置好后因为要加载插件等操作需要时间不要着急,加载完成后,打开右侧Maven项目,刷新一下,我们可以看到一个tomcat插件已经存进来了,直接双击run就可以运行tomcat了。

run运行后,当前项目就可以在上面运行了,并且会告诉你访问地址。


除了使用tomcat插件我们还可以配置tomcat插件:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <packaging>war</packaging>

  <name>WebAppTest01</name>
  <groupId>com.test</groupId>
  <artifactId>WebAppTest01</artifactId>
  <version>1.0-SNAPSHOT</version>

<!--构建-->
  <build>
  <!--添加插件-->
    <plugins>
      <!--具体插件配置-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>9090</port><!--端口-->
          <path>/</path><!--设置虚拟路径-->
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

如果嫌弃一直点击run麻烦,我们也可以在页面再添加一个maven执行命令。


当然一般这种情况是用来debug的。


下面介绍一下pom.xml常用的配置的说明:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

  <!-- 指定pom的模型版本 -->
  <modelVersion>4.0.0</modelVersion>
  <!-- Web工程打包为war,Java工程打包为jar -->
  <packaging>war</packaging>

  <name>WebAppTest01</name>
  <!-- 组织id -->
  <groupId>com.test</groupId>
  <!-- 项目id -->
  <artifactId>WebAppTest01</artifactId>
  <!-- 版本号:一般有两个release(完成版)和snapshot(快照,开发版本) -->
  <version>1.0-SNAPSHOT</version>

<!--构建-->
  <build>
  <!--添加插件-->
    <plugins>
      <!--具体插件配置-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>9090</port><!--端口-->
          <path>/</path><!--设置虚拟路径-->
        </configuration>
      </plugin>
    </plugins>
  </build>

  <!-- 设置当前工程所有的依赖 -->
  <dependencies>
    <!--具体依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
  </dependencies>

</project>

15. Maven 依赖

15.1 依赖


依赖指当前项目运行所需的jar,一个项目可以设置多个依赖,它就是通过pom.xml下的dependencies来设置。

15.2 依赖传递

15.2.1 直接依赖 和 间接依赖


简而言之,就是项目1依赖于项目2,那么项目1也会依赖项目2所依赖的内容,自然这些依赖了的内容也是可以让项目1使用的,这就是依赖传递。

当然因为上面这种情况,也就分为了:直接依赖和间接依赖。

15.2.2 依赖传递的冲突问题


冲突问题就是可能依赖的插件或包中,有版本不同的,不同层级的。

下面的路径优先和声明优先必须知道!

16. Maven 可选依赖 和 排除依赖


可选依赖指对外隐藏当前所依赖的资源 (不透明)。

在dependency标签下有一个optional标签,该标签声明为true就可以对外隐藏所依赖的资源,默认为false。


这里我们是项目1是依赖了项目2 , 上面的情况是在项目2中配置,从而让项目1看不到。


接下来我们可以在项目1中配置,不想看到项目2的依赖。

这就用到排除依赖:

注意:排除依赖和可选依赖不一样,虽然效果相同,但排除依赖是主动断开这个依赖资源!换句话说,就是当前依赖我们不使用,就可以排除了。

使用exclusions标签来配置:

17. Maven 依赖范围


scope标签,是用来定义Maven的依赖范围的。

scope范围如下:

  • compile(也是默认):在main中执行,在test中执行,打包也要打包进去。例如:log4j,无论什么时候都需要日志记录啊。
  • test:就是仅仅在test模块结构中使用,例如:junit。
  • provided:在main中执行,在test中执行,但是有些情况是绝对不能参与打包的,例如:servlet-api,如果打包添加了一个2版本,但是服务器是3版本,这样我们将包放到服务器,就版本不同奔溃了呀。
  • runtime:仅仅是打包能参与。

我们也可以通过右侧Maven项目看依赖的范围是多少。


依赖范围的传递性:

在我们依赖传递的过程中,设定的scope范围可能彼此不相同。

18. Maven 生命周期 与 插件

18.1 Maven 生命周期(lifecycle)


Maven构建生命周期描述的是一次构建过程经历了多少个事件。

Maven对项目构建的生命周期划分为3套。

  • clean:清理工作。
  • default:核心工作,例如:编译,测试,打包,部署等。
  • site:产生报告,发布站点。

clean构架的生命周期又分为下面3个阶段:

  • pre-clean:执行一些需要在clean之前完成的工作。
  • clean:移除所有上一次构建生成的文件。
  • post-clean:执行一些需要在clean之后立刻完成的工作。

default构建的生命周期有很多阶段,见图下:

而我们执行哪一个命令,其实就是从上向下的一个执行步骤。

例如:我们执行compile命令,只需要从第一个到complie就可以了。我们执行install命令,那我们就需要从第一个执行到install命令,期间也执行了compile和test等命令,这就是生命周期的一个效果。


site构建生命周期的四个阶段:

  • pre-site:执行一些需要在生成站点文档之前完成的工作。
  • site:生成项目的站点文档。
  • post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
  • site-deploy:将生成的站点文档部署到特定的服务器上。

18.2 Maven 插件


插件和生命周期内的阶段是绑定的!在执行到对应生命周期时执行对应的插件过程。

也就是插件时可以伴随上面生命周期的阶段来运行的,可以让我们自定义其他功能,这个时候需要定义好execution标签如下:


就像上面说的,执行lifecycle生命周期的命令时,它是从上往下的命令开始的,因此我们generate-test-resources阶段是在complie命令之后,test-compile命令之前的,因此执行compile不会执行响应插件,执行test-compile就会经过generate-test-resources这个阶段了。


总结,生命周期就是指当前是哪个阶段,而插件则是定义好在哪一个生命周期阶段要做什么事情!

以上是关于Maven 基础知识总结笔记 的主要内容,如果未能解决你的问题,请参考以下文章

Maven 基础知识总结笔记

Maven 学习笔记 基础环境搭建

springmvc学习总结 -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

Maven学习笔记总结

Maven学习笔记总结

线程学习知识点总结