Maven的核心概念

一、Maven坐标和仓库

  Maven坐标是一个唯一的标识,用于表示我们的项目的一些信息或者引用jar包的位置。而这些唯一标识指向的地方就是maven仓库,仓库就是用来统一存储所有Maven共享构建的位置。

Maven仓库的分类:

maven仓库

  • 本地仓库:
      在Maven的settings.xml文件中进行配置:<localRepository>本地仓库的路径</localRepository>
      每个用户只能有一个本地仓库
  • 远程仓库:
      中央仓库:Maven默认的远程仓库
        地址:http://repo1.maven.org/maven2
      私服:是一种特殊的远程仓库,它是架设在局域网内的仓库,我们在上一节中配置Maven的settings.xml文件时,就设置了阿里云的私服。
<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

Maven坐标的构成:
  GroupId:定义当前Maven项目隶属的项目
  ArtifactId:定义实际项目中的一个模块
  version:定义当前项目的当前版本
  packaging:定义该项目的打包方式(如果坐标表示应用jar包的位置,则没有这个属性)

Maven坐标的作用:
   Maven世界有大量的构建,我们需要找一个用来唯一标识一个构建的统一规范,用了统一的规范,我们就可以把查找的工作交给机器。

Maven中jar包的引用方法:
   我们可以在http://mvnrepository.com/中查找我们需要的jar包坐标。

查找jar包

   然后找到我们需要的版本,将该版本的jar包加入到项目的pom.xml文件中去。
jar包的坐标

pom.xml文件

   保存后我们可以发现,我们的项目中出现了这个jar包
jar包引用成功

二、Maven的依赖管理与依赖规范

1、依赖范围

  在Maven中我们可以通过设置依赖范围控制依赖和编译、测试、运行的classpath的关系,主要有四种依赖关系:

  • compile:默认编译依赖范围。对于编译、测试、运行的三种classpath都有效。
  • test:测试依赖范围,只对于测试classpath有效。
  • provided:已提供依赖范围。对于编译、测试的classpath都有效,但对于运行无效。
  • runtime:测试和运行时提供。


    Maven的依赖范围

2、依赖范围的使用

  在之前的学习中,我们使用不同包中的类可以通过导包的方法实现,但是不能在不同的项目中相互调用类或者方法。现在我想在项目A中调用项目B中的方法,我们可以通过将项目B打包成一个jar包,然后导入到项目A中去,这样,项目A就可以使用项目B的方法了。
  现在,我们创建两个java项目进行测试。
  首先在mavenJava01中创建一个Time类,在这个类中写一个获取当前时间毫秒值的方法。

package com.itheima.mavenJava01;

public class Time {
    
    //获取当前系统时间的毫秒值
    public long getCurrentTime(){
        long time = System.currentTimeMillis();
        return time;
    }
}
mavenJava01项目

  然后我们将mavenJava01项目的pom.xml文件中的坐标复制到mavenJava02项目的pom.xml文件中去,我们可以发现,mavenJava02项目Maven Dependencied中出现了mavenJava02项目,这样我们可以说mavenJava02项目依赖于mavenJava01项目。


pom.xml

mavenJava02项目

  在mavenJava02项目中创建一个类,调用Time类中的方法,控制台输出了当前时间的毫秒值。

package mavenJava02;

import com.itheima.mavenJava01.Time;

public class PrintTime {
    public static void main(String[] args) {
        Time time = new Time();
        System.out.println(time.getCurrentTime());
    
    }
}
当前时间的毫秒值

  由于maven中的Java项目默认的依赖范围是compile,我们的mavenJava02项目依赖于mavenJava01项目,也就可以使用mavenJava01项目中的类和方法。如果我们修改mavenJava01项目pom.xml文件中的依赖范围,mavenJava02项目就可能不能调用mavenJava01项目中的类和方法。

3、直接依赖和间接依赖

  我们使用一个例子来说明直接依赖和间接依赖。我们现在有两个项目,分别是项目1和项目2,项目1的pom.xml文件中我们引入了junit的jar包,然后我们又在项目2的pom.xml文件中加入了项目1的坐标。

  • 项目1:
      pom.xml:junit
  • 项目2:
      pom.xml:加入项目1的坐标

这样我们可以说:
  (1)junit是项目1的直接依赖
  (2)项目1是项目2的直接依赖
  (3)junit是项目2的间接依赖

这也被称为传递性依赖。传递性依赖的影响范围如下图所示:

传递性依赖的影响范围

  图中的第四行第四列应该是不能进行传递。

我们在项目中进行实现:
  首先在mavenJava01项目pom.xml文件中引入junit的jar包,影响范围是test。

mavenJava01项目pom.xml文件

  然后我们还在mavenJava02项目pom.xml文件中放入mavenJava01项目的坐标,但是我们发现Maven Despendencies中没有导入junit的jar包。如果我们将mavenJava01项目中的junit的jar包依赖范围改为compile,我们就会发现Maven Despendencies中出现了junit的jar包。

修改依赖范围

4、依赖控制和依赖排除

  依赖控制:控制自己的依赖的包是否向下传递
  依赖排除:可以排除掉某些我们不需要的jar包

我们来进行测试:
  首先我们在mavenJava01项目中对junit的jar包设置依赖控制,我们发现mavenJava02项目中Maven Despendencies中没有了junit的jar包。

依赖控制

  然后我们去掉依赖控制,在mavenJava02项目中设置依赖排除,我们也可以发现mavenJava02项目中Maven Despendencies中没有junit的jar包。

依赖排除

三、Maven的生命周期

  Maven的生命周期是为了对所有的构建过程进行抽象和统一,包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。

Maven的三大生命周期:

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

注意:Maven的三大生命周期是相互独立的,在只调用clean清理工作目录的时候,site和default都不会执行;但是可以使用命令同时执行三套生命周期。

Maven的生命周期

1、clean生命周期

clean生命周期分为三个阶段:

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

  由于mvn命令指向的是生命周期的阶段,所以mvn clean指向的就是clean阶段,但是需要注意的是,运行某个阶段的时候,这个阶段之前的阶段都会被运行,我们再执行mvn clean的时候,pre-clean和clean阶段都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。

2、site生命周期

site生命周期分为四个阶段:

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

  这里常用的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这是Maven非常强大的功能,可以自动生成文档和统计数据。

3、default生命周期

  default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中,我们在这里只解释一些比较重要和常用的阶段:

  • process-resources:复制并处理资源文件至目标目录,准备打包
  • compile:编译项目的源代码
  • process-test-resources:复制并处理资源文件至目标测试目录
  • test-compile:编译测试源代码
  • test:使用合适的单元测试框架进行测试。这些测试代码不会被打包或部署
  • package:接受编译好的代码,打包成可发布的格式
  • install:将包安装至本地仓库,以让其他项目依赖
  • deploy:将最终的包复制到远程的仓库,以让其他开发人员与项目共享

四、Maven的插件

  Maven实际上相当于一个骨架,是抽象的东西,没有做具体的事情,要想做一些事情就需要加入插件,这些插件的运行同时也依赖着Maven的生命周期,需要在那个Maven生命周期去执行插件,去执行插件的那个功能,都需要在配置文件中进行配置。下面介绍一些常用的插件:

1、指定源码的jdk版本

  由于maven的默认编译使用的jdk版本很低,使用maven-compiler-plugin插件可以指定项目源码的jdk版本,编译后的jdk版本,以及编码,在source标签和target标签中设置jdk的版本。

   <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

2、tomcat插件

  用于配置tomcat的路径和端口号

<plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <path>/</path>
          <port>8080</port>
        </configuration>
      </plugin>
    </plugins>
  </build>

3、打包源码插件

<plugin>  
      <artifactId>maven-source-plugin</artifactId>  
      <version>2.4</version>  
      <configuration>  
           <attach>true</attach>  
      </configuration>  
      <executions>  
            <execution>  
                  <phase>package</phase>  
                  <goals>  
                        <goal>jar-no-fork</goal>  
                   </goals>  
            </execution>  
        </executions> 
</plugin> 

  标签phase中配置的是什么时候执行插件,上面的属性package就是指在运行mvn package的时候执行插件。
  标签goal中配置的是执行查件的那个功能,上面的属性jar-no-fork就是要执行插件的jar-no-fork功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,252评论 6 39
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,678评论 6 342
  • 有一天,你不再寻找爱情,只是去爱; 你不再渴望成功,只是去做; 你不再追求成长,只是去修。 那么,一切才真正开始。...
    我在007阅读 541评论 0 0
  • 与坚持无关 墨烨日更百日 之第58天 没想到光明牛奶又一次惹怒了我。事情是这样的。 今儿是11月第一天,前几天...
    静若无心阅读 8,622评论 6 1