码迷,mamicode.com
首页 > 其他好文 > 详细

Maven-pom.xml

时间:2016-04-18 22:34:34      阅读:622      评论:0      收藏:0      [点我收藏+]

标签:

POM:Poject Object Model,项目对象模型。

项目基础信息:

modelVersion:

  当前POM模型的版本。

groupId:

  当前Maven项目隶属的实际项目。

artifactId:

  当前Maven项目的实际项目名称。推荐使用项目名-模块名的方式。

version:

  项目当前的版本。

packaging:

  项目的打包方式。默认为jar。

classifier:

  定义构建输出的一些附属构件。如源码、javadoc等。不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成。

  artifactId-version [-classifier].packaging

name:

  声明了一个对于用户更友好的项目名称。

属性配置:

   properties:

  • 内容属性

  ${basedir}:项目根目录。

  ${version}:项目版本。

  • POM属性

  ${project.artifactId}:对应<project><artifactId>元素的值。

  ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/。

  ${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/。

  ${project.build.directory}:项目构建输出目录,默认为target/。

  ${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/。

  ${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes/。

  ${project.groupId}:项目的groupId。

  ${project.artifactId}:项目的artifactId。

  • 自定义属性

  properties:

    property name:

  • Settings属性

  用户使用以settings.开头的属性引用settings.xml文件中XML元素的值。

  • Java系统属性
  • 环境变量属性

  用户使用以env.开头的属性引用环境变量。

依赖管理:

dependencies:依赖信息。

  dependency:单一依赖信息。

    groupId:依赖的组ID。

    artifactId:依赖的组唯一标识。

    version:依赖的版本。

    type:依赖的类型,对应于项目坐标定义的packaging。

    scope:依赖范围。

    optional:标记依赖是否可选。

    exclusions:排除传递性依赖。

      exclusion:排除传递性依赖。

        groupId:

        artifactId:

依赖范围:

  用于控制依赖与classpath(编译classpath、测试classpath、运行classpath)之间的关系。

  • compile:编译依赖范围,为默认依赖范围。范围为compile的依赖,对于编译、测试、运行三种classpath都有效。
  • test:测试依赖范围。范围为test的依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
  • provided:已提供依赖范围。范围为provided的依赖,对于编译和测试classpath有效,但在运行时无效。
  • runtime:运行时依赖。范围为runtime的依赖,对于测试和运行classpath有效,但在编译主代码时无效。
  • system:系统依赖范围。依赖范围与provided一致。使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。systemPath元素可以引用环境变量。
  • import:导入依赖范围。该依赖范围不会对三种classpath产生实际的影响。只在dependencyManagement元素下有效。
依赖范围(scope) 对于编译classpath有效 对于测试classpath有效 对于运行classpath有效 例子
compile Y Y Y spring-core
test - Y - JUnit
provided Y Y - servlet-api
runtime - Y Y JDBC驱动
system Y Y - Maven仓库之外的类库

传递性依赖:

  account-email->spring-core->commons-logging

  Maven会解析各个直接依赖的POM,将必要的间接依赖以传递性依赖的形式引入到当前的项目中。

  compile test provided runtime
compile compile - - runtime
test test - - test
provided provided - provided provided
runtime runtime - - runtime

  当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样是provided;当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为润time。

依赖调解:

  • 路径最近者优先。
  • 第一声明者优先。

可选依赖:

   项目的传递依赖中,可选依赖不会对项目产生任何影响。在理想的情况下,是不应该使用可选依赖的。

排除依赖:

  显式的排除传递性依赖,而后手动指定依赖。Maven解析后的依赖中,不可能出现groupId和artifactId相同但是version不同的两个依赖。 

归类依赖:

  使用properties定义属性,而后使用${}进行引用。

依赖解析机制:

  1. 当依赖的范围是system的时候,直接从本地文件系统解析构件。
  2. 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功。
  3. 在本地仓库不存在相应构件的情况下,如果依赖的版本是显式的发布版本构件,则遍历所有的远程仓库,发现后,下载并解析使用。
  4. 如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实的值,然后基于这个真实的值检查本地和远程仓库,如步骤2和3。
  5. 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
  6. 如果最后解析得到的构建版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,并使用该非时间戳格式的构件。

  RELEASE:最新发布版本,不包括快照版本。

  LATEST:最新版本,包括快照版本。

聚合:

  将多个Maven项目或模块组合成一个项目,以便进行统一的构建。

<packaging>pom</packaging>

<modules>

  <module>{相对于当前POM的目录}</module>

</modules>

继承:

  消除重复配置。

<parent>

  <groupId></groupId>

  <artifactId></artifactId>

  <version></version>

  <relativePath>{默认值为../pom.xml}</relativePath>

</parent>

可继承的元素:

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

依赖管理:

  让子模块继承到父模块的依赖配置,同时保证子模块依赖使用的灵活性。

反应堆:

  所有模块组成的一个构建结构。

properties:

  propertyName: 

  project.build.sourceEncoding:指定读取源码及文档的编码。

  project.reporting.outputEncoding:指定呈现站点的html文档的编码。

远程仓库配置: 

repositories:

  repository:

    id:

    name:

    url:

    releases:

      enabled:

      updatePolicy:配置从远程仓库检查更新的频率。

        never:从不检查更新。

        always:每次构建都检查更新。

        interval:每隔X分钟检查一次更新。

        daily:每天检查一次更新。

      checksumPolicy:配置Maven检查检验和文件的策略。

        warn:在执行构建时输出警告信息。

        fail:在执行构建时失败。

        ignore:完全忽略校验和错误。

    snapshots:

      enabled:

    layout: 

插件管理:

pluginManagement:

  plugins:

    plugin:

      groupId:

      artifactId:

      executions:

        execution:

          id:

          phase:

          goals:

插件仓库配置:

pluginRepositories:

  pluginRepository:

  id:

  name:

  url:

  layout:

  snapshots:

    enabled:

  releases:

    enabled:

项目构建: 

build:

  plugins:

    plugin:

      groupId:

      artifactId:

      configuration:

    executions:

      execution:执行任务。

        id:

        phase:绑定的生命周期。

        goals:指定插件目标。

          goal:

资源过滤:

  resources:

    resource:

      directory:

      filtering:

  testResources:

    testResource:

      directory:

      filtering:

  profiles:

    profile:

      id:

      properties:

      activation:

        property:在某个系统属性存在时自动激活profile。

          name:

        os:操作系统环境激活。

          name:

          family:

          arch:

          version:

        file:文件存在与否激活。

          missing:

          exists:

        activeByDefault:默认激活。

  -P:在命令行激活一个profile。

项目发布:

distributionManagement:

  repository:发布版本仓库。

    id:

    name:

    url:

  snapshotRepository:快照版本仓库。

    id:

    name:

    url:

项目信息:

 scm:

  connection:

  developerConnection:

  url:

ciManagement:

  system:

  url:

developers:

  developer:

    id:

    name:

    email:

    timezone:

issueManagement:

  system:

  url:

licenses:

  license:

    name:

    url:

快照版本:

  在发布快照版本时,Maven为其打上时间戳。在项目依赖时,如果依赖的版本为快照版本,则按照更新规则更新快照版本。

  快照版本只应该在组织内部的项目或模块间依赖使用。项目不应该依赖于任何组织外部的快照版本依赖。

Maven约定:

  • 源码目录未src/main/java/
  • 编译输出目录未target/classes/
  • 打包方式为jar
  • 包输出目录未target/

 

Maven-pom.xml

标签:

原文地址:http://www.cnblogs.com/qhdxqxx/p/5240842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!