木柴

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

引用一个正式的 Apache Maven的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project
Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你
用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。

maven安装好后的目录项:LICENSE.txt包含Apache Maven的许可证,NOTE.txt包含Maven依赖的类库所需要的通告及权限。README.txt包含安装指令,/bin目录下是运行Maven的mvn脚本,boot/目录下包含创建Maven运行所需的类加载器的jar文件,conf/目录包含全局settings.xml文件,定义机器上Maven的行为,用户自定义行为可以在home目录下.m2下复写setting.xml文件。lib/目录包含Maven核心Jar文件。

在命令行使用命令 mvn archetype:create -DgroupId=,-DartifactId=,-DpackageName=。可以生成一个简单项目,artifactId指定了项目的名称,项目源码和资源文件放置在src/main目录下,测试代码在src/test目录,同时还包含一个项目文件pom.xml,称为项目对象模型。这个文件描述了整个项目,配置了插件,声明了依赖。

解释下命令的含义,archetype:create是一个插件标识和一个目标标识,这里一个插件是一个或多个目标的集合,而一个目标是一个明确的任务,是maven的一个工作单元,目标可以通过配置属性进行配置,定制目标的行为,create是插件archetype的一个目标,执行这个目标时,用-D配置了目标参数。create目标定义了一个配置属性archetypeArtifactId,默认值为maven-archetype-quickstart,用以生成一个最小项目的躯壳,包括一个类和一个项目文件pom。pom.xml文件内容

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.bruce.mu</groupId>
  <artifactId>app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

从groupId开始,groupId,artifactId,version,packaging四个元素定义了一个项目的坐标,即唯一标识一个项目。这个坐标也是标识了一个地址,可以写成冒号分隔的格式:groupId:artifactId,packageing,version。packageing可以是jar或war,jar打包成普通jar文件,而war打包成web应用。如果一个项目被安装到maven仓库,在仓库中项目就按照坐标保存和寻找。在pom.xml所在目录运行命令mvn install可以将项目安装到maven仓库。install是一个生命周期阶段,它会把项目构建安装到maven仓库,以使其他项目能够将其作为依赖。

maven运行一个项目,是根据pom中的设置来组合运行的,一个最上级的POM定义了maven的安装目录,定义了全局默认值,运行时多个pom组合在一起,mvn help:effectiove-pom可以查看maven运行此项目时真正的POM。

maven的命令有两种,一种如创建一个项目那样,由一个插件标识,目标标识和配置参数组成,还有一种如mvn install是指定一个生命周期阶段,即构建一个生命周期整个过程中的一个环节。而生命周期是指一个项目构建过程中所经历的有序阶段。生命周期是可定制的,但maven有默认的生命周期。

插件与目标可以附着在生命周期阶段上,随着生命周期的移动,会执行附着在特定阶段上的插件目标,每个阶段可能绑定多个目标,执行一个生命周期阶段时,会执行从生命周期开始到该阶段的所有阶段,即执行这些阶段上附着的所有插件目标。下图显示了默认生命周期阶段上绑定的插件目标:

resources:resources
Resources插件的resources目标绑定到了resources 阶段。这个目标复制src/main/resources下的所有资源和其它任何配置的资源目录,到输出目录。
compiler:compile
Compiler插件的compile目标绑定到了compile 阶段。这个目标编译src/main/java下的所有源代码和其他任何配置的资源目录,到输出目录。
resources:testResources
Resources插件的testResources目标绑定到了test-resources 阶段。这个目标复制src/test/resources下的所有资源和其它任何的配置的测试资源目录,到测试
输出目录。
compiler:testCompile

Compiler插件的testCompile目标绑定到了test-compile 阶段。这个目标编译src/test/java下的测试用例和其它任何的配置的测试资源目录,到测试输出
目录。
surefire:test
Surefire插件的test目标绑定到了test 阶段。这个目标运行所有的测试并且创建那些捕捉详细测试结果的输出文件。默认情况下,如果有测试失败,这个目标
会终止。

jar:jar
Jar插件的jar目标绑定到了package 阶段。这个目标把输出目录打包成JAR文件。

maven仓库:第一次运行maven时,maven将从远程仓库下载很多文件,构件和插件是在被需要是从远程仓库下载的,默认的远程仓库地址可以被替换,甚至可以自定义一个自组织的仓库供引用。maven仓库是一堆项目构件的集合,他们安装特定的目录结构存储,而这些目录结构是安装项目构件的坐标来组织的。maven会在本地机器上建一个本地仓库,缓存从远程仓库下载的构件和插件,这个仓库是.m2/repository.maven寻找构件是会先从本地开始寻找。

maven依赖管理:一个项目的pom文件中定义了插件依赖,如上图pom.xml定义junit插件,是基于maven的坐标定位插件的具体位置。有时候一个项目依赖的构件本身也会依赖其他更多的构件,maven项目依赖的构件为直接依赖,而依赖构件所依赖的构件为此maven项目的间接依赖,pom文件中只需定义直接依赖,Maven会隐式的把间接依赖的库也加入项目中,并处理依赖冲突。事实上当处理一个直接依赖时,maven从仓库(先本地后远程)下载构件,同时下载.pom文件,以junit为例,按此junit依赖的坐标,会下载junit:junit:3.8.1,其实这是一个目录,包含一个.jar文件和一个.pom文件,.jar文件就是所需的依赖构件,而.pom文件中同时定义了此构件所需依赖的构件。maven也会检查此pom以导入间接依赖。maven同时下载构件和pom文件的行为支持了依赖传递。

maven同时提供依赖范围,junit的依赖范围是<scope>test</scope>,当一个依赖的范围是test,就是说此构件只有在test类型的目标运行是才会使用。举例来说,在complier插件的complie目标运行时不会使用,而当complier:testComplie,surefire:test时会被加入classpath。

当为项目创建JAR文件的时候,它的依赖不会被捆绑在生成的构件中,他们只是用来编译。当用Maven来创建WAR或者EAR,你可以配置Maven让它在生成的构件中捆绑依赖,
你也可以配置Maven,使用provided范围,让它排除WAR文件中特定的依赖。provided范围告诉Maven一个依赖在编译的时候需要,但是它不应该被捆绑在构建的输出中。当你
开发web应用的时候provided范围变得十分有用,你需要通过Servlet API来编译你的代码,但是你不希望Servlet API的JAR文件包含在你web应用的WEB-INF/lib目录中。

posted on 2013-07-13 18:56  木柴  阅读(307)  评论(0编辑  收藏  举报