项目依赖项存储在存储库服务器(在 Maven 术语中简单地称之为存储库)上。要成功的解析依赖项,需要从包含该工件的存储库里找到所需的依赖性工件。
基于 POM 中的项目依赖项信息,该依赖项解析器试图以下列方式解析依赖项:
1.检查本地存储库中的依赖项。
2.检查远程存储库列表中的依赖项。
3.如果前两步失败,则报告一个错误。
Maven 2 本地存储库是磁盘上的一个目录,通常位于HomeDirectory/.m2/repository。这个库扮演着高性能本地缓存的角色,存储着在依赖项解析过程中下载的工件。远程存储库要通过网络访问。可以在 settings.xml 配置文件中维护一个远程存储库列表以备使用。
默认情况下,第二步中所涉及的第一个远程存储库是一个能在全球访问的集中式 Maven 2 存储库,它包含了最流行的开源项目的一些工件。在内部开发中,可以设置额外的远程存储库来包含从内部开发模块中发布的工件。可以使用 settings.xml 中的 <repositories> 元素来配置这些额外的远程存储库。
Maven 坐标是一组可以惟一标识工件的三元组值。坐标包含了下列三条信息:
组 ID:代表制造该工件的实体或组织。例如,com.ibm.devworks 就是一个组 ID。
工件 ID:实际的工件的名称。例如,主体类名为 OpsImp 的项目也许会用 OpsImp 作为其工件 ID。
版本:该工件的版本号。
<dependencies> <dependency> <groupId>com.ibm.devworks</groupId> <artifactId>OpsImp</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
特别限定词 SNAPSHOT 告诉 Maven 2:该项目或模块还处于开发状态中,它应该获取最新版的可用工件。
Maven 维护了一个工件的 POM 文件,同时也为该工件和其存储库中的 POM 维护了检验和散列。
插件是适应 Maven 的插件框架的软件模块。现在,可以使用 Java、Ant 或 Beanshell 来创建自定义插件。
插件中的每个任务称作一个Mojo。有时,插件也被视为一套相关的 Mojo。
Maven 2 是预先打包好的,以便于下载,它和许多常用插件一起使用。大多数典型开发任务不需要使用额外插件。
. Maven 2 默认生命周期的各阶段
生命周期阶段 描述
验证 确保当前配置和 POM 的内容是有效的。这包含对pom.xml 文件树的验证。
初始化 在执行构建生命周期的主任务之前可以进行初始化。
生成源码 代码生成器可以开始生成在以后阶段中处理或编译的源代码。
处理源码 提供解析、修改和转换源码。常规源码和生成的源码都可以在这里处理。
生成资源 可以生成非源码资源。通常包括元数据文件和配置文件。
处理资源 处理非源码资源。修改、转换和重定位资源都能在这阶段发生。
编译 编译源码。编译过的类被放到目标目录树中。
处理类 处理类文件转换和增强步骤。字节码交织器和常用工具常在这一阶段操作。
生成测试源码 mojo 可以生成要操作的单元测试代码。
处理测试源码 在编译前对测试源码执行任何必要的处理。在这一阶段,可以修改、转换或复制源代码。
生成测试资源 允许生成与测试相关的(非源码)资源。
处理测试资源 可以处理、转换和重新定位与测试相关的资源。
测试编译 编译单元测试的源码。
测试 运行编译过的单元测试并累计结果。
打包 将可执行的二进制文件打包到一个分布式归档文件中,如 JAR 或 WAR。
前集成测试 准备集成测试。这种情况下的集成测试是指在一个受到一定控制的模拟的真实部署环境中测试代码。这一步能将归档文件部署到一个服务器上执行。
集成测试 执行真正的集成测试。
后集成测试 解除集成测试准备。这一步涉及测试环境重置或重新初始化。
检验 检验可部署归档的有效性和完整性。过了这个阶段,将安装该归档。
安装 将该归档添加到本地 Maven 目录。这一步让其他可能依赖该归档的模块可以使用它。
部署 将该归档添加到远程 Maven 目录。这一步让这个工件能为更多的人所用。
mvn archetype:create
要创建能用 Maven 构建的简单 Java 项目所需的一切,可以使用 Archetype 插件,它是 Maven 2 中的标准插件。不同于构建阶段插件,Archetype 在 Maven 项目构建生命周期之外运行,用于创建Maven 项目。
在您想要包含 NumOps 项目的目录中执行下列命令
mvn archetype:create-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=com.ibm.devworks -DartifactId=NumOps
mvn compile
编译。
这个命令使 Maven 2 引擎从构建生命周期一直运行到编译阶段,并执行相应的 mojo。您应该看到构建成功的报告,如果这是第一次运行,那会花点时间,因为一些依赖项需要经过 Internet 从中央存储库下载。
mvn test
命令运行所有的 mojo 一直到测试阶段。
mvn install
将打包的模块安装到本地目录中。这使得任何依赖于它的模块可以不访问源代码就能解析依赖项。
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ibm.devworks</groupId> <artifactId>mavenex2</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Example2</name> <url>http://maven.apache.org</url> <modules> <module>NumOps</module> <module>OpsImp</module> </modules> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> <dependencyManagement> <dependencies> <dependency> <groupId>com.ibm.devworks</groupId> <artifactId>OpsImp</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
新代码以粗体突出显示。首先,这个主项目的工件 ID 是 mavenex2,其打包类型是 pom。这向 Maven 2 传递出这样的信号:这是一个多模块项目。
随后,<modules> 标记指定组成此项目的两个模块:NumOps 和 OpsImp。
这个主项目的子模块能从这个 pom.xml 文件中继承属性。说得更具体一点,这些子模块都不需要将 JUnit 声明为一个依赖项,即使它们都包含单元测试。这是因为它们继承了顶层定义的 JUnit 依赖项。
<dependencyManagement> 标记不指定此模块依赖的依赖项。相反,它主要由子模块使用。子模块能指定 <dependencyManagement> 标记中任何条目的依赖项,而无需指定具体的版本号。当项目树更改依赖项的版本号时,这很有用,可以使需编辑的条目数目最小化。在本例中,OpsImp 项目的版本号是使用 ${project.version} 指定的。在执行 Maven 时,这是一个会被相应值所填充的参数。
<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/maven-v4_0_0.xsd"> <parent> <groupId>com.ibm.devworks</groupId> <artifactId>mavenex2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>NumOps</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.ibm.devworks</groupId> <artifactId>OpsImp</artifactId> </dependency> </dependencies> </project>
POM 中将 OpsImp 项目指定为一个依赖项。请注意,在这个依赖项中没有指定任何版本号。在它的父项目的 <dependencyManagement> 元素里已经指定了首选的版本号。
只要从一个高层 POM 中继承,您总能在了解了所有继承元素后发现相对应的 pom.xml 是什么样。显示“effective POM”的命令是 mvn help:effective-pom。您将看到一些您还没有指定的元素。这些都是从 Super POM 中继承的。每个项目 pom.xml 都从 Maven 内嵌的 Super POM 中隐式地继承。