maven要点整理

### maven 目录结构

因为mvn指令就是执行的java指令,所以建议设置MAVEN-OPTS环境变量值为-xms128m-xmx512m已满足maven运行可用内存.

setting.xml

通常有两个地方设置setting.xml,一个是maven文件夹自身下位置,另一个是位于user的.m2文件夹下.前者是全局性的,后者是用户性质的,建议使用后者.

在setting.xml里面可以添加maven仓库的,HTTP代理 若有多个proxy代理,默认第一个生效

    <proxy>
      // 代理名称
      <id>my-proxy</id>
      // 是否激活
      <active>true</active>
      // 代理协议
      <protocol>http</protocol>
      // 代理服务认证用户名
      <username>proxyuser</username>
      // 代理服务认证密码
      <password>proxypass</password>
      // 代理主机名
      <host>proxy.host.net</host>
      // 代理端口
      <port>80</port>
      // 忽略代理的主机名
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>

pom.xml

pom(项目对象模型),描述项目如何构建,项目间的依赖.

pom元素约定

    <modelVersion>4.0.0</modelVersion> // 指定当前POM模型的版本
    <groupId>com.carhouse.user</groupId>// 定义 项目属于哪个组,公司,组织
    <artifactId>carhouse-user</artifactId>// 当前项目在组中唯一的ID
    <version> // 指定当前项目的版本
    <packaging>pom</packaging> // 项目打包目标,默认为jar包(默认为artifact-version.jar规则命名)
    <name>(user)用户系统父工程</name> // 对用户更加友好的项目命名方式 
    
    // 项目依赖
    <dependency>
        // 依赖目标的groupId,artifactId,version坐标描述
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>1.1.1</version>
        // 依赖的类型
        <type></type>
        // 依赖范围 默认为compile 测试和主代码都可用;test 测试代码可用;import 
        <scope>import</scope>
        // 标记依赖是否可选
        <optional></optional>
        // 用来排除传递性依赖
        <exclusions></exclusions>
        // 除了主构件以外的附加组件
        <classifier></classifier> 
    </dependency>

根据maven约定 项目主代码通常放到 src/main/java目录下;测试代码通常放到src/main/java目录下;java类的包名都应该基于groupId和artifactId,这样更加清晰,更加符合逻辑,方便搜索构件和java类

因为核心插件compiler只支持到jdk1.3,所需下载其他版本compiler

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

依赖dependency

依赖范围

我们使用标签表示依赖范围,依赖范围用来控制依赖与编译classpath,测试classpath,运行classpath之间的关系

compile:编译依赖范围.对三种classpath都有效. test:测试依赖范围.支队测试classpath有效 provided:已提供依赖范围.对编译和测试classpath有效 runtime:运行时依赖范围.对测试和运行classpath有效 system:系统依赖范围与三种classpath有效,不通过maven仓库解析,可引入环境变量 import:导入依赖范围.三种classpath都不会有实际影响.

Maven解析后的依赖中,不会出现groupId和artifactId相同而version不相同的两个依赖

传递性依赖会造成重复依赖的问题,Maven的依赖调解的第一原则是:路径最近这优先;第二原则:第一声明者优先.

可选依赖,当一个项目实现多个特性时,需要用到可选依赖.可选依赖是不会被传递的.

排除依赖 当我们不需要某个传递性依赖时,使用exclusions排除依赖

归类依赖 项目中有多个地方引用相同某个依赖,这个依赖也是有版本号,也会升级,为了便于以后引用依赖的地方升级方便,使用Maven属性归类依赖.


    <properties>
        <junit.version>4.0</junit.version>
    </properties>
    
    <dependency> 
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
    </dependency>

优化依赖 mvn dependency:list 得到自动解析所有项目的直接依赖和传递性依赖后的已解析依赖

mvn dependency:tree 查看当前项目的依赖树

mvn dependency:analyze 分析当前项目依赖情况,会得到两个重要的指标.

Maven仓库 mavne仓库里的构件根据group,artifactid/version等来确定坐标路径

仓库分类 此处输入图片的描述

Maven生命周期 mvn指令

maven插件与生命周期的绑定 TODO

聚合和继承 用户可以通过在一个打包方式为pom的Maven项目(聚合模块)中声明任意数量的module元素来实现模块的聚合.为了方便快速定位内容,模块所处目录名称应当与其artifactId一致.聚合模块和其他模块并非一定要是父子关系.还可以是平行目录结构(但是要修改元素路径内容).

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

使用dependencyManagement声明的依赖既不会给该模块引入依赖,也不会给它的子模块引入依赖,不过这段配置是会被继承的。 子模块只需配置简单的groupId和artifactId就能得到对应的依赖信息.子模块可以通过标签,import范围依赖由于其特殊性,一般都是指向打包类型为pom的模块。如果有多个项目,它们使用的依赖版本都是一致的,则就可以定义一个使用dependencyManagement专门管理依赖的POM,然后在各个项目中导入这些依赖管理配置。

相同的插件方面的管理使用<pluginManagement>元素管理插件,得到的效果和dependencyManagement元素一样

聚合和继承的关系

Maven的核心设计理念是,约定优于配置,使用约定能够大量的减少配置.

反应堆 在一个多模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构。对于单模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。 模块间的依赖关系会将反应堆构成一个有向非循环图(Directed Acyclic Graph,DAG),各个模块是该图的节点,依赖关系构成了有向边。这个图不允许出现循环,因此,当出现模块A依赖于B,而B又依赖于A的情况时,Maven就会报错。

裁剪反应堆 有时候,我们会有需要构建完整反应堆中的某些个模块

快照版本向发布版的过渡需满足

  1. 所有自动化测试全部通过
    1. 项目没有任何快照版本的依赖 3项目没有任何快照版本的插件 4代码已全部提交到版本控制系统中

maven版本号定义 <主版本>.<次版本>.<增量版本>-<里程碑版本>

maven属性:

资源过滤: 使用文件定义不同环境的资源配置, 打包的时候使用mvn install -p*,来激活不同的环境 *代表profile中的id属性