maven学习

1、什么是Maven

  • Maven主要是基于Java平台的项目构建、依赖管理和项目信息管理
  • Build-每天有很多的时间花在了编译、运行单元测试。生成文档,打包和部署等繁琐且不起眼的工作上,这个就是构建
  • Maven可以帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包部署

2、Maven的安装和配置

  • 安装Maven
  • 安装目录分析
bin:包含了运行的脚本文件,包括
shell脚本和bat脚本(新版更新成了cmd脚本)
boot:一个类加载器框架,提供了更加丰富的语法
conf:里面的settings.xml可以全局控制Maven的行为
lib:包含了Maven运行时需要的Java类库
  • ~/.m2文件夹
默认包含Maven的本地仓库.m2/repository

3、Maven使用入门

  • 编写POM
    groupId、artifactId、version这三个元素定义了一个项目基本的坐标

  • 编写主代码
    主代码位于 src/main/java目录

  • 编写测试代码
    测试代码位于 src/test/java目录

  • 打包和运行
    当没有在POM中指定打包类型时,使用默认的jar进行打包
    如果希望其他的Maven项目引用,需要使用 mvn install 这个命令

  • 使用Archetype生成项目结构
    mvn archetype : generate
    如果希望其他的Maven项目引用,需要使用 mvn install 这个命令

4、坐标和依赖

  • 何为Maven坐标
    包含groupId、artifactId、version、packaging、classifier

  • 坐标详解
    packaging:有jar、war等。缺省值为:jar
    classifier: 定义一些附属构建,不能直接定义项目的classifier,是由附加的插件帮助生成的

  • 依赖的配置

<dependencies><dependency>标签
groupId、artifactId、version坐标
type:依赖的类型
scope:依赖的范围
optional:标记依赖是否可选
exclusions:排除传递性依赖
  • 依赖范围(scope)
有三种classpath(编译classpath、测试classpath、运行classpath)
compile:编译依赖范围,对三种classpath都有效;
test:测试依赖范围,只对测试classpath有效;
provided:已提供依赖范围,只对编译和测试classpath有效;
runtime:运行时依赖范围,对测试、运行classpath有效;
system:系统依赖范围,只对编译和测试classpath有效。(这种依赖是不通过maven仓库找依赖包的,会从systemPath指定的路径中寻找依赖包,所以不具备移植性)
import:导入依赖范围。
  • 传递性依赖
传递性依赖的又意思就是:A->B,B->C,=>A->C
            compile        test        provided        runtime

compile     compile        ——           ——           runtime
test            test        ——           ——             test
provided    provided        ——         provided      provided
runtime      runtime        ——           ——           runtime
  • 依赖调节
    依赖调节第一原则:路径最近者优先
    依赖调节第二原则:第一声明者优先(也就是在POM先定义的先依赖)

  • 可选依赖
    A->B, B->可选C, B->可选D, 则 C,D不会被传递依赖给A

  • 最佳实践

排除依赖:<exclusions>下的<exclusion>标签
归类依赖:<properties>中定义一个元素test,以后需要的地方直接引用${test}
优化依赖:mvn dependency:list  查看当前项目已解析依赖
                 mvn dependency:tree 查看依赖树
                 mvn dependency:analyze 分析依赖树

5、仓库

  • 什么是maven仓库
    在某个统一的位置存储所有的Maven项目构件,这个统一的位置就是仓库

  • 仓库的布局
    根据构件的坐标定义存储路径

  • 仓库的分类
    本地仓库:
    mvn clean install 命令会将当前构件安装到本地仓库中去

  • 远程仓库的配置

在Pom文件中配置远程仓库<repository>...</repository>
releases和snapshots包含 updatePolicy和checksumPolicy;
updatePolicy:表示maven从远程仓库检查更新的频率。(never,默认always,interval:X每个x分钟检查)
checksumPolicy:下载artifact时,进行文件校验。(默认warn,fail,ignore)
在settings.xml文件中添加<server>...</servers>中的<id></id>会和Pom中的仓库对应
部署artifact至远程仓库:<distributionManagement>...</distributionManagement>
部署artifact命令:mvn clean deploy;
快照版本:snapshot,maven会自动加上版本号;
当有依赖时,maven会自定进行最新版本的artifact下载,maven默认每天检查一次,也就是仓库的updatePolicy属性,也可以使用 mvn clean install-U 属性强制检查更新
  • 从仓库解析依赖的机制
这种显示版本:本地仓库---> 远程仓库
release和latest:读取所有远程仓库元数据maven-metadata.xml--->与本地仓库元数据合并--->计算release和latest的真实值--->本地仓库寻找--->远程仓库寻找--->将真实值替换成release和latest,修改artifact名字并使用
snapshot:读取所有远程仓库元数据maven-metadata.xml--->与本地仓库元数据合并--->计算snapshot的真实值--->本地仓库寻找--->远程仓库寻找--->替换成release和latest,修改artifact名字并使用
  • 镜像
    在settings配置文件中添加…
    id表示仓库劫持,任何对id仓库的访问都会劫持到镜像仓库中去

6、生命周期和插件

  • 何为生命周期
    maven的生命周期:清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成
    maven的生命周期本身不做任何工作,实际工作(如编译)是由插件来完成的

  • 生命周期详解
    maven有三套生命周期,clean:清理项目、default:构建项目、site:建立项目站点
    每个生命周期包含一些phase(阶段),后面的phase依赖于前面的phase

clean生命周期:
                         pre-clean:
                         clean:
                         post-clean
default生命周期:validate:
                            initialize:
                            generate-sources:
                            process-sources:处理项目主资源文件。对/src/main/resources目录的内容进行变量替换,复制到项目输出的主ClassPath目录中
                            generate-resources:
                            process-resources:
                            compile:编译项目的主源码。src/main/java
                            process-classes:
                            generate-test-sources:
                            process-test-sources:处理项目测试资源文件。src/test/resources
                            generate-test-resources:
                            process-test-resources:
                            test-compile:编译项目的测试代码。src/test/java
                            process-test-classes:
                            test:使用单元测试框架进行测试,测试代码不会打包和部署
                            prepare-package:
                            papckage:使用编译好的代码,打包成可发布的版本,如JAR
                            pre-integration-test:
                            integration-test:
                            post-integration-test:
                            verify:
                            install:将包安装到Maven本地仓库,供本地其他项目使用
                            deploy:将artifact复制到远程仓库,供其他项目使用
site生命周期:建立和发布项目站点
                            pre-site:
                            site:生成项目站点文档
                            post-site:
                            site-deploy:将生成的项目站点发布到服务器上
  • 插件目标
多个功能聚集在一个插件里,每个功能对应一个插件的目标:
ie. dependency:anlyze--->分析项目依赖
     dependency:tree--->画出项目的依赖树
     dependency:list--->列出项目的依赖
  • 插件绑定
    生命周期的phase与plugin 的goal绑定在一起完成工作,
    ie,default的compile与maven-compiler-plugin:compile目标绑定在一起
内置的绑定:clean
------------------------------------------------------------
        生命周期阶段                          插件目标      
------------------------------------------------------------
           pre-clean        
              clean                       maven-clean-plugin:clean
           post-clean
内置的绑定:site
------------------------------------------------------------
        生命周期阶段                         插件目标      
------------------------------------------------------------
           pre-clean        
              site                      maven-site-plugin:site
           post-site
           site-deploy                  maven-site-plugin:deploy
内置的绑定:default(jar)
----------------------------------------------------------------------------------------------
        生命周期阶段                                插件目标      
----------------------------------------------------------------------------------------------
     process-resources                 maven-resources-plugin : resources
         compile                           maven-compiler-plugin : compile
   process-test-resources            maven-resources-plugin : testResources
         test-compile                 maven-compiler-plugin : testCompile
          test                             maven-surefire-plugin : test
        package                                 maven-jar-plugin : jar
        install                              maven-install-plugin : install
        deploy                             maven-deploy-plugin : deploy
自定义绑定:<bulid>
                  <plugins>
                          <plugin>
                               <executions>
                                     <execution>
                                          <id>...</id>
                                          <phase>...</phase>
                                          <goals>
                                                <goal>...</goal>
                                           </goals>
                                     </execution>
                                </executions>
                         </plugin>
                  </plugins>
         </build>
当多个 plugin:goals 绑定到 同一个phase时,按照绑定的顺序执行
  • 插件配置
    命令行插件配置:-Dkey=value ig:mvn install -Dmaven.test.skip=true
    POM插件配置:当configuration放在下时,表示这个是全局配置在
<plugin>
         <configuration>
                   ......
         </configuration>
</plugin>

POM中插件任务配置:当configuration放在下时,表示这个是特定任务

   <execution>
        <configuration>
        </configuration>
   </execution>
  • 获取插件信息
    在线插件信息
    使用maven-help-plugin 描述插件:
mvn help:describe
  • 从命令行调用插件
mvn dependency:tree

之所以可以使用dependency代替groupId:artifactId:version,是因为后者artifactId的前缀的值是前者

  • 插件解析机制

插件仓库:

<pluginRepositories>
      <pluginRepository>
      </pluginRepository>
</pluginRepositories>

插件的默认groupId:
若插件为Maven的官方插件,则在POM配置中可以省略groupId的值org.apache.maven.plugins

解析插件版本:
1,在super POM中设定了核心插件的版本,当用户使用核心插件时,不指定版本,就会使用 super POM中的版本
2,若使用了非核心插件,且没有指定版本,则会检查所有插件仓库中的版本,解析到最新的 release版本(maven2 会解析至latest,maven3 会解析至release)

解析插件前缀:
1,会查询groupId/maven-metadata.xml
2,groupId默认的值为:org.apache.maven.plugins 和 org.codehaus.mojo(因为大部分的插件 都是这两个仓库开发的)
3,如果想在检查其他的仓库元数据,在settings.xml中添加

             <settings>
                   <pluginGroups>
                            <pluginGroup>......</pluginGroup>
                    </pluginGroups>
              </settings>

7、聚合和继承

  • 聚合
    创建一个额外的聚合maven项目,包含多个maven项目,这样就可以统一构建多个maven项目
    聚合的maven项目pom(packaging的打包方式必须为pom)
      <modules>
               <module>maven项目一(相对路径)</module>
               <module>maven项目二(相对路径)</module>
      </modules>

聚合项目与其他maven项目即可以是父子关系,也可以是平行关系,只需要相对路径配置正确即可

  • 继承
    可以将子模块中公共的部分提取出来,放到父模块中。
    父模块的打包方式为pom,子模块的pom中需要继承父模块的pom
<parent>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <relativePath>../account-parent/pom.xml(相对路径)</relativePath>
  </parent>

可以继承的pom元素:

groupId:项目组ID
version:项目的版本
description:项目的描述信息
organization:项目的组织信息
inceptionYear:项目的创始年份
url:项目的URL地址
developers:项目的开发者信息
contributors:项目的贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目的缺陷跟踪系统信息
ciManagement:项目的持续集成系统信息
scm:项目版本控制信息
mailingLists:项目的邮件列表信息
properties:自定义的maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目仓库地址配置
build:项目源码目录配置、输出目录配置、插件配置、插件管理配置
reporting:项目的报告输出目录配置、报告插件配置

dependencyManagement元素能让子模块继承到父模块的依赖配置,在dependencyManagement中声明的依赖不会引入实际的依赖。可以在父模块的dependencyManagement中添加如下配置:

<dependencyManagement>
    <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${springframework.version}</version>
    </dependency>
    </dependencies>
  </dependencyManagement>

子模块需要使用这个依赖时:

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
    </dependency>

虽然相比于之前,只少了版本这一行,但是可以统一整个项目中的依赖版本号。推荐使用

当想在另外一个项目中使用相同的dependencyManagement时,可以使用import范围依赖:

<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <type>pom</type>(type只能是pom类型)
    <scope>import</scope>
</dependency>
  • 插件管理:
    pluginManagement元素集中管理插件,xml配置文件信息如上

  • 聚合与继承的关系:
    聚合:聚合模块知道哪些被聚合的模块,但被聚合的模块不知道聚合模块的存在
    继承:父POM不知道子模块,但子模块都知道父POM的存在
    可以将聚合和继承的代码都放到同一个pom文件中

  • 约定优于配置:

  • 反应堆的构建顺序:
    1,maven按顺序读取pom,如果该pom没有依赖模块,那么就构建该模块
    2,否则就先构建其依赖的模块
    3,如果该依赖还依赖其它的模块,则进一步先构建依赖的依赖

  • 裁剪反应堆:
     1-am--also-make):构建所列模块的依赖模块
     2-amd(--also-make-dependents):构建所列模块的依赖模块,构建依赖于依赖模块的其它模块
     3-pl(--projects):构建指定的模块,模块间用逗号隔开
     4,  -rf(--resume-from):在完整的反应堆上,指定从哪个模块开始往后构建

8、使用maven构建web项目

  • web的archetype
org.apache.maven.archetypes:maven-archetype-webapp

9、版本管理

  • 何为版本管理
org.apache.maven.archetypes:maven-archetype-webapp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值