自动化构建工具Maven

@[toc]java

简介

现在咱们构建一个项目须要用到不少第三方的类库,一个项目jar包的数量之多每每让咱们没法想象,而且jar包之间的关系错综复杂,一个jar包每每又会引用其余jar包,缺乏任何一个jar包都会致使项目编译失败。以往开发项目时,人们每每须要花较多的精力在引用Jar包搭建项目环境上,而这一项工做尤其艰难,由于jar包之间的关系很复杂,当某些jar包无用后,又很难将其从中去除。而Maven就是一款帮助程咱们构建项目的工具,咱们只须要告诉Maven须要哪些jar 包,它会帮助咱们下载全部的jar,极大提高开发效率。web

Maven的核心概念

那么既然你看到了这篇文章,我暂且就认为你对Maven有必定的了解而且已经完成了Maven的下载安装和环境变量的配置。关于Maven的安装配置网上教程有不少,我就不作重复的事情了,咱们直接进入正题。来看看关于Maven的核心概念:spring

  • 约定的目录结构
  • POM
  • 坐标
  • 依赖
  • 仓库
  • 生命周期
  • 继承
  • 聚合

那么,我么就从这八个方面来深刻学习一下Maven。api

1.约定的目录结构

对于目录结构,Maven有着本身的规定,因此咱们只须要了解Maven自动构建生成的目录结构及其做用。app

2.POM

POM(Project Object Model),项目对象模型。在Maven构建的项目中,pom.xml是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。重要程序至关于web.xml对于Web工程。框架

3.坐标

咱们类比数学中的坐标:在平面上,使用X、Y两个向量能够惟一地定位平面上的任何一个点;在空间中,使用X、Y、Z三个向量能够惟一地定位空间中的任何一个点。那么在Maven中,使用下面三个向量能够惟一地定位仓库中的任何一个点。eclipse

  • groupId:公司或组织域名倒序 + 项目名
  • artifactId:项目名
  • version:版本号

这是一个逐渐缩小范围的定位,在现实生活中,你要邮寄一个快递,你得先写省份,而后写市区,而后写县乡,最后是具体哪栋楼或某个位置。咱们看一个例子:在这里插入图片描述在仓库中有这样一个jar包,咱们如何来定位它呢?咱们看到该文件夹下有一个pom文件,咱们打开看一看:(截取了部分)在这里插入图片描述咱们只看关键部分,那么在Maven中,工程的坐标与仓库中的路径实际上是同样的,因此咱们能够经过这三个向量组拼出一个路径:webapp

commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar复制代码

jar文件的命名规则是atrifactId - 版本号。而咱们查看仓库目录,发现jar文件所处的文件路径确实如此,这就是Maven管理jar包的一个统一方式。jsp

4.依赖

Maven解析依赖信息时,会到本地仓库中查找被依赖的jar包。对于咱们本身开发的Maven工程,使用install命令安装后就能够进入仓库。依赖中比较重要的一个概念是依赖范围,依赖范围可分为三类:maven

  • compile
  • test
  • provided

在主程序中是没法看到测试程序的,可是在测试程序中可以看到主程序,因此compile范围对主程序和测试程序都有效,而且参与打包;而test范围对主程序无效,对测试程序有效,不参与打包;provided范围对主程序和测试程序都有效,但不参与打包。

这里简单提一提关于依赖的传递性:在工程中能够经过其它工程进行一个依赖的传递,能够传递的依赖没必要在每一个模块工程中都重复声明,在最底部的工程中依赖一次便可。可是依赖中的传递也不是绝对的,例如非compile的依赖没法传递。相反地,依赖具备排除性。当你不想要某些jar包时,就须要设置依赖的排除方式:

<exclusions>
    <exclusion>
        <groupId></groupId>
        <artifactId></artifactId>
    </exclusion>
</exclusions>复制代码

这样便可将jar包排除,但它只能在当前工程生效。依赖原则:

  • 验证路径最短者优先
  • 验证路径相同时先声明者优先

5.仓库

在Maven中,仓库可分为两类:

  • 本地仓库:当前电脑上部署的仓库目录,为当前电脑上全部Maven工程服务
  • 远程仓库(远程仓库亦可分为三类):
      - 私服:搭建在当前局域网环境下,为当前局域网范围内的全部Maven工程服务
      - 中央仓库:架设在Internet上,为全世界全部Maven工程服务
      - 中央仓库镜像:架设在各个大洲,为中央仓库分担流量,减轻中央仓库的压力,同时更快地响应用户请求

而仓库中保存的内容就是Maven工程,可分为三类:

  • Maven自身所须要的插件
  • 第三方框架或工具的jar包
  • 本身开发的Maven工程

6.生命周期

Maven中的生命周期,其实就是各个构建环节的顺序。构建环节:

  • [1]清理:将之前编译获得的旧的class字节码文件删除,为下一次编译作准备
  • [2]编译:将Java源程序编译成class字节码文件
  • [3]测试:自动测试,自动调用JUnit程序
  • [4]报告:测试程序执行的结果
  • [5]打包:动态Web工程打war包,Java工程打jar包
  • [6]安装:Maven中特定的概念——将打包获得的文件复制到仓库中的指定位置
  • [7]部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以正常运行

这个构建顺序不可以被打乱,必须顺序执行。Maven的核心程序中定义了抽象的声明周期,生命周期中各个阶段的具体任务是由插件来完成的。Maven有三套相互独立的生命周期,分别是:

  1. Clean Lifecycle:在进行真正的构建以前进行一些清理工做
  2. Default Lifecycle:构建的核心部分,编译、测试、打包、安装、部署等等
  3. Site Lifecycle:生成项目报告,站点,发布站点

它们是相互独立的,你能够仅仅调用clean来清理工做目录,仅仅调用site来生成站点,固然你也能够直接运行mvn clean install site运行全部这三套生命周期。关于每套生命周期的具体内容不作分析。而Maven核心程序为了更好地实现自动化构建,按照这一特色执行生命周期的各个阶段:不论如今要执行生命周期中的哪一阶段,都是从这个生命周期最初的位置开始执行。

7.继承

假设一个情景:Hello项目依赖的JUnit版本:4.0Hello2项目依赖的JUnit版本:4.0Hello3项目依赖的JUnit版本:4.9因为test范围的依赖不能传递,因此必然会分散在各个模块中,很容易产生版本不一致的问题。那么咱们就能够将JUnit依赖版本统一提取到父工程,在子工程中声明依赖时不指定版本便可,那么子工程将会以父工程中统一设定的版本为准,同时也便于修改。注意若是一个工程做为父工程,打包方式应为pom。在子工程中使用parent标签来声明父类的引用。

8.聚合

做用:一键安装各个模块工程配置方式:在一个总的聚合工程中配置各个参与聚合的模块。经过models标签进行配置。而后只需在聚合工程上执行安装命令便可一键安装全部模块工程。

Maven插件的设置

前面说了这么多关于Maven的理论知识,不光本身说得口干舌燥,看的人确定也已经晕头转向了。可是没办法, 基础知识咱们得掌握,而后才能在实际运用中更加驾轻就熟。那么接下来咱们就实际操做一下Maven工程,这里以eclipse为例。首先是Maven插件的设置:只要不是版本特别老的eclipse,它都已经内置了Maven插件,咱们只须要设置一下便可。点击Windows,而后选择Preferences打开首选项窗口。在这里插入图片描述咱们点击Installations设置一下Maven的路径,eclipse会内置一个Maven,但一般认为内置的Maven不够好,不够稳定,因此咱们点击Add,而后找到咱们本身下载的Maven,添加进去便可。而后User Setting用于指定Maven仓库的位置,eclipse默认会本身找到。在这里插入图片描述设置完毕后,咱们在eclipse中建立一个Maven版的Java工程:右键->New->Other->找到Maven Project->Next在这里插入图片描述该Java工程默认会有一个JDK版本,若是想直接修改默认JDK版本,能够来到Maven安装目录下的conf目录,打开settings.xml文件,找到profiles标签,而后在里面添加:

<profile>
        <id>jdk-1.7</id>
        <activation>
            <activeByDefalut>true</activeByDefalut>
            <jdk>1.7</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.7</maven.compiler.source>
            <maven.compiler.target>1.7</maven.compiler.target>
            <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
        </properties>
    <profile>复制代码

那么接下来演示一下如何建立Web工程:在这里插入图片描述具体建立的是什么工程,实际上是由Packaging决定,若是选的是jar,则建立Java工程;若是选的是war,则建立Web工程。在这里插入图片描述那么能够看到的是,Maven构建的Web工程并无web.xml文件,致使工程报错,webapp下也没有任何东西,显然这个Web工程是不完整的,咱们来解决这一问题。右键点击工程,而后选择Properties,打开配置窗口:在这里插入图片描述点击Projecy Facets,会发新Dynamic Web Module默认是选中的,咱们把勾去掉,接着点击Apply,而后又把勾打上,这时你会发现下面多出了一个选项,咱们点击打开窗口:在这里插入图片描述按照上面的进行修改,而后点击OK。如今项目就不报错了。在这里插入图片描述然而当你在webapp目录下新建了一个jsp文件后,项目又报错了。在这里插入图片描述这是由于项目中缺乏Apache Tomcat的运行环境,那怎么解决呢?打开pom.xml,咱们知道,HttpServlet在servlet-api的jar包下,那么咱们就能够经过pom文件进行该jar包的导入,在pom.xml文件中添加下面的依赖:

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>复制代码

点击保存后项目立马就不报错了。而后咱们运行一下程序,程序正确运行,接着来到部署目录下,发现lib目录是空的。在这里插入图片描述这是由于依赖的范围是provided,若是咱们将依赖范围设置为compile,再运行看效果。在这里插入图片描述这时候jar包就被下载到了lib目录。这也解释了上面说的依赖范围关系。如今咱们来到index.jsp文件编写一条EL表达式:在这里插入图片描述会发现pageContext后面没有提示而request有,这是由于request是serlvet-api包下的,而这个jar包咱们在刚才已经导入了,因此,咱们只须要导入pageContext所在的jar包便可,在pom文件下添加一条依赖:

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1.3-b06</version>
    <scope>provided</scope>
</dependency>复制代码

如今pageContext的提示就出来了。在这里插入图片描述关于依赖的范围问题要尤其重视,若是你将jsp-api的范围设置为compile,项目运行后会产生一个空指针异常,显然这个异常不是咱们的代码产生的,由于咱们压根就没写什么代码。若是依赖范围设置为了compile,咱们知道jar包是会被下载到lib目录下的,而jsp-api须要依赖两个jar包,这样总共就下载了三个jar包,而这些jar包在Tomcat中也存在。此时这些jar包就会产生冲突,从而形成一些没法理解的错误。因此依赖范围必定要严谨。

统一管理依赖的版本

假如咱们在作一个项目,一开始使用的是spring4.0的版本,可是后面咱们须要对jar包进行升级,将版本升级为5.0,该如何升级呢?咱们知道,spring框架所依赖的jar包很是多,一个一个地在pom文件中进行修改显然不合理。那么在pom中,咱们有一个很好的配置方式:[1]使用properties标签内部使用自定义标签统一声明版本号[2]在须要统一版本的位置,使用${自定义标签名}引用声明的版本号

经常使用Maven命令

注意:执行与构建过程相关的Maven命令,必须进入pom.xml文件所在的目录。经常使用命令:

  • [1]mvn clean:清理
  • [2]mvn compile:编译主程序
  • [3]mvn test-compile:编译测试程序
  • [4]mvn test:执行测试
  • [5]mvn package:打包
  • [6]mvn install:安装
  • [7]mvn site:生成站点

然而关于这些jar包的依赖信息咱们不可能可以熟记,而事实上咱们也不须要去记,只是在须要的时候上网搜索一下便可。贴上一个查询依赖信息的网站:https://mvnrepository.com/ 须要什么jar包的依赖信息,只需在搜索框输入而后搜索便可。在这里插入图片描述

相关文章
相关标签/搜索