zoukankan      html  css  js  c++  java
  • Maven 介绍

    本文主要介绍以下几个部分:

    1.  安装目录分析
    2. Maven 依赖
    3. 继承和聚合
    4. 生命周期和插件

    首先介绍一下Maven 名词

    • POM(Project Object Model)项目对象模型
    • 坐标groupId , artifactId , version ,packaging,classifier
    • Dependency
    • Plug-in:Maven是有插件组织的,它的每一个功能都是由插件提供的
    • Repository:仓库仓库用来存放artifact的,可以是本地仓库,也可以是远程仓库
    • Snapshot:快照 工程正在处于开发阶段

    安装目录分析

    bin:包含了mvn运行的脚本;这些脚本用来配置Java命令,准备好classpath和相关的java系统属性,然后执行java命令

    boot:包含一个类加载器框架,maven 使用它加载自己的类库

    conf:settings.xml 在机器上全局配额maven的行为

    lib:maven 运行时需要的java 类库;

    ~/.m2 默认只有repository 仓库文件,一般用户都会复制settings.xml 过来;

    Maven 依赖

     一、Maven依赖配置

    • groupId , artifactId , version 基本坐标
    • Type 依赖的类型,默认是jar
    • Scope 依赖范围( compile , test, provided, runtime, system )
    • Optional 标记依赖是否可选
    • Exclusions 用来排除传递的依赖

    二、Maven 依赖范围

    1. compile :编译依赖范围。 编译,测试,运行都有效,默认的选择
    2. test : 测试依赖范围。测试有效,例如junit
    3. provided : 已提依赖范围。编译,测试有效,例如 servlet ,运行时容器会提供实现
    4. runtime :运行时依赖范围。 运行和测试有效,例如 jdbc,编译时只需相应的接口,测试和运行时才需要具体的实现
    5. system :系统依赖范围。 编译,测试有效。使用此范围的依赖必须通过systemPath元素显式的指定依赖文件,因而
    此类依赖是不通过Maven仓库解析的,一般适合于本机测试环境下,依赖本地起的服务。

    编译、测试、运行 各自使用一套classpath,

    依赖范围就是用来控制依赖与这三种classpath的关系

    三、传递性依赖

    • 假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。
    • 表格的第一列是B在A中的依赖范围,第一行是C在B中的依赖范围,交叉的格子是C在A中的依赖范围

     

    四、依赖调解

    • 第一原则:路径最近者优先
    • 第二原则:第一声明优先

    五、依赖归类

     

    Maven 继承和聚合

    一、继承

    • dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
    • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

    二、聚合

    • 方便快速构建
    • 一个命令构建多个模块, 需要额外创建一个模块,然后通过该模块构建整个项目的所有模块

     

    生命周期和插件

    • Maven的生命周期就是为了对所有的构建过程进行抽象和统一;编译、测试、打包、集成测试、验证、部署和站点的生成都能映射到一个生命周期上;
    • 生命周期是抽象的,不做任何实际的工作(如编译源代码),实际任务都交由插件来完成。每个构建步骤都可以绑定一个或多个插件行为;

    一、三套生命周期

    • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
    • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
    • Site Lifecycle 生成项目报告,站点,发布站点。

    1、Clean Lifecycle

     

    2、Default生命周期

    3、Site生命周期

     

    二、命令行和生命周期

    • 从命令行执行maven 任务主要就是调用maven 的生命周期阶段;
    • 各个生命周期相互独立,一个生命周期的阶段是有前后依赖的
    • 如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开
    • mvn clean ; mvn test; mvn clean install ;
    • mvn clean deploy site-deploy

    三、插件

    • Maven生命周期与插件相互绑定,来完成实际的构建任务比如:编译这一任务,它对应了default生命周期的compile这一阶段,而maven-compiler-plugin 这一插件的compile的这一目标能够完成任务;
    • 一个插件包含多个功能,每个功能就是一个插件目标;

    1、内置绑定

     

                default 生命周期阶段与插件目标的绑定关系图:

     

    2、自定义绑定

            一个常见的例子是创建项目的源码jar包。内置的插件绑定关系中没有涉及这一任务,因此需要用户自行配置。maven-source-plugin可以帮助我们完成该任务,它的jar-no-fork目标能够将项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上,在执行完集成测试后和安装构件之前创建源码jar包。具体配置见下

     

    3、插件配置

    • 用户可以配置插件目标参数,调整插件目标来执行任务;
    • 命令行插件配置
    • 使用语法:
    • maven命令 -D参数=参数值
    • 比如:mvn install -Dmaven.test.skip=true,其中maven命令为install,参数为maven.test.skip,参数值为true,

    4、pom中插件全局配置

     

    5、获取插件信息

    • 在线插件信息 http://maven.apache.org/plugins/
    • 使用maven-help-plugin 描述插件
    • 可以运行如下命令来获取maven-compiler-plugin2.1版本的信息:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1

    6、从命令行调用插件

    • 除了mvn命令激活生命周期阶段从而执行绑定的插件目标外,还支持直接从命令行调用插件目标;
    • mvn help:describe-Dplugin=complier
    • mvn dependency:tree
    • help 是maven-help-plugin的目标前缀;
    • dependency是maven-dependency-plugin的目标前缀

    7、常用Maven插件

    • maven-archetype-plugin  项目的骨架
    • maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze可以告诉你项目依赖潜在的问题
    • maven-enforcer-plugin建一系列规则强制大家遵守,包括设定Java版本、设定Maven版本、禁止某些依赖、禁止 SNAPSHOT依赖
    • maven-help-plugin

    网站支持

  • 相关阅读:
    深度分析:java8的新特性lambda和stream流,看完你学会了吗?
    花了三天整理,Spring Cloud微服务如何设计异常处理机制?还看不懂算我输
    做了两年java,这些高性能高可用高并发的技术架构你都知道吗?
    面试阿里,字节跳动90%会被问到的微服务,你确定不进来看看吗?
    阿里面试官:小伙子,你给我说一下前后端分离的接口规范是什么?
    深度分析:面试阿里,字节跳动,美团几乎都会被问到的阻塞队列
    1. 线性DP 1143. 最长公共子序列
    1. 线性DP 300. 最长上升子序列 (LIS)
    GC 的认识(转) https://github.com/qcrao/Go-Questions/blob/master/GC/GC.md#1-什么是-gc有什么作用
    缓存淘汰算法--LRU算法
  • 原文地址:https://www.cnblogs.com/baoconghui/p/10876155.html
Copyright © 2011-2022 走看看