美文网首页
Apache Maven

Apache Maven

作者: zhangyaxu | 来源:发表于2019-03-18 17:23 被阅读0次

    一 Maven简介

    作为 Apache 组织中的一个颇为成功的开源项目,Maven主要用于基于Java平台的项目的构建和依赖的管理。
    maven官网:http://maven.apache.org/
    maven下载:https://archive.apache.org/dist/maven/binaries/
    maven坐标查询:https://mvnrepository.com/

    二 Maven下载、安装、配置、与IDEA的整合

    https://www.cnblogs.com/xihehua/p/9639045.html

    三 Maven中的核心概念

    3.1 maven的坐标

    在高中,我们都学过空间三维直角坐标系,(x,y,z)可以精确的定位到一个点;maven作为一个庞大的构建仓库,其规范也是如此,通过(groupId,artifactId,version)我们可以精准的定位一个具体的依赖 jar

    • groupId:定义当前Maven项目隶属项目,比如:com.alibaba.otter
    • artifactId:定义实际项目中的一个模块
    • version:定义当前项目的当前版本
    • packaging:定义该项目的打包方式,默认为jar, 父子项目中,父项目的打包方式通常为pom( 即<packaging>pom</packaging>)

    3.2 maven的依赖范围与依赖管理

    依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系
    Maven的依赖管理:使用scope来定义我们依赖的jar包的范围

    1. compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的maven依赖,对于编译 测试 运行三种的classpath都有效。
    2. test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试的classpath有效,在编译主代码或者运行主代码的时候都无法依赖此类依赖。典型的例子是jUnit,它只有在编译测试代码及运行测试代码的时候才有效。
    3. provided:以提供依赖范围。使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候,由于容器已经提供,就不需要maven重复地引入一遍。打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
    4. runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要jdk提供的jdbc的接口,只有在执行测试或者运行测试的时候才需要实现上述接口的jdbc的驱动
    5. system :系统依赖范围。从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径,该依赖与三种范围的classpath的关系,
      和provided依赖范围完全一致。可能造成不可移植,谨慎使用。
    3.3 maven的仓库管理

    对于Maven来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标寻找构件的时候,它会首先查看本地仓库,如果本地仓库存在此构件,则会直接使用;如果本地仓库不存在此构件,maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用(注意:假如你的网络不好,下载过程中断,你的本地仓库就会出现.lastUpdated文件,再次下载时要把.lastUpdated文件删除,不然下载会出现问题)。如果本地仓库和远程仓库都没有用需要的构件,Maven就会报错

    远程仓库:包括公司的nexus 、阿里云与maven的中央仓库

    3.4 maven的生命周期

    Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

    1. clean生命周期:清理项目,包含三个phase。
    1)pre-clean:执行清理前需要完成的工作
    
    2)clean:清理上一次构建生成的文件
    
    3)post-clean:执行清理后需要完成的工作
    
    1. default生命周期:构建项目,重要的phase如下。
    1)validate:验证工程是否正确,所有需要的资源是否可用。
    2)compile:编译项目的源代码。  
    3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
    4)Package:把已编译的代码打包成可发布的格式,比如jar。
    5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
    6)verify:运行所有检查,验证包是否有效且达到质量标准。
    7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
    8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
    
    1. site生命周期:建立和发布项目站点,phase如下
    1)pre-site:生成项目站点之前需要完成的工作
    
    2)site:生成项目站点文档
    
    3)post-site:生成项目站点之后需要完成的工作
    
    4)site-deploy:将项目站点发布到服务器
    

    命令行与生命周期

    生命周期有前后依赖关系。 
    mvn clean 调用clean生命周期的clean阶段,执行pre-clean和 clean 
    mvn test 调用default生命周期的test阶段,执行从validate 到 test的所有阶段 
    mvn clean install 调用clean周期和 default的从validate到 install的所有阶段。 
    Maven命令都是基于这些阶段的简单组合而成的。
    

    四 Maven中的插件

    jdk1.8

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
       </plugin>
    

    五 Maven使用中的一些坑

    父子模块,deploy子模块到nexus,其他人拉取不下来

    解决办法一:
       在parent的pom下执行deploy, 这样就会自动将parent pom以及子module全部发布到仓库了,当然也可以在不需要deploy的子module的pom里配置skip参数,禁止提交
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
       <version>2.8.2</version>
        <configuration>
            <skip>true</skip>
        </configuration>
    </plugin>
    
    解决办法二:
        把子module的parent去掉,不去依赖仓库中没有的pom,将子module提升为一个独立的maven项目单独发布
    
    解决办法三:
    使用如下命令: mvn deploy -pl 模块名 -am
    

    相关文章

      网友评论

          本文标题:Apache Maven

          本文链接:https://www.haomeiwen.com/subject/oxavmqtx.html