大型软件应用程序通常包含多个模块,常见的场景是多个团队开发同一应用程序的不同模块。例如,假设一个团队开发应用程序的前端,项目是app-ui(app-ui.jar:1.0),而另一个团队则开发应用程序后端,项目是数据服务(data-service.jar:1.0)。 现在可能发生的情况是,开发数据服务的团队正在进行快速的bug修复或项目改进,他们几乎每隔一天就会将库发布到远程仓库。现在,如果数据服务团队每隔一天上传一个新版本,就会出现以下问题:
<modelVersion>4.0.0</modelVersion>
<groupId>app-ui</groupId>
<artifactId>app-ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>health</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>data-service</groupId>
<artifactId>data-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
数据服务团队应在每次发布更新代码时通知应用程序ui团队。 app ui团队需要定期将pom.xml文件更新到最新版本。 为了解决这个问题,快照的概念非常有用。 什么是快照? 快照是指定当前开发进度副本的特殊版本。与常规版本不同,Maven每次构建时都会检查远程存储库中的新快照。现在,数据服务团队每次都会将更新的代码快照发布到仓库,例如,dataservice:1.0-snapshot,以替换旧的快照jar包。 项目快照与版本
C:\MVN\app-ui>mvn clean package -U
对于该版本,如果Maven以前下载过指定的版本文件,例如data-service:1.0,Maven将不再从仓库下载新的1.0文件。要下载更新的代码,数据服务版本需要升级到1.1。 在快照的情况下,每次应用ui团队构建项目时,Maven都会自动获取最新的快照(数据服务:1.0-snapshot)。
Maven的一个核心特性是依赖关系管理。当我们处理多模块项目(包括数百或数千个模块或子项目)时,模块之间的依赖关系变得非常复杂,管理变得困难。对于这种情况,Maven提供了一种高度控制方法。 传递相关性发现 例如,一个非常常见的情况是,A依赖于其他库B。如果另一个项目C想要使用A,那么项目C也需要使用库B。 Maven可以避免搜索所有必需的库。Maven通过读取项目文件(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">
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
我们需要做的就是在每个项目的pom中定义直接依赖关系。Maven将在其他方面帮助我们。 所有包含的库的图形将通过传递性依赖关系快速增长。当存在重复的数据库时,可能的情况将继续增加。Maven提供了一些函数来控制传递依赖的程度。
插件是使用plugins元素在pom.xml中定义的。 每个插件可以有多个目标。 可以定义阶段,插件将使用其阶段元素开始处理。我们使用了清洁阶段。 可以通过绑定到插件的目标来配置要执行的任务。我们已经将echo任务绑定到maven antrun插件的运行目标。 就这样。Maven将处理剩下的问题。它将下载本地存储库中不可用的插件并开始处理。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.clean</id>
<phase>clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>clean phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
我们在示例中广泛使用了maven antrun插件来将数据输出到控制台。请查看Maven-BuildProfile部分。让我们更好地理解这一部分,并在C:MVN项目目录中创建一个pom.xml文件。
<code>mvn compiler:compile</code>
安装Maven后,不会创建Maven的本地存储库。它是在第一次执行Maven命令时创建的。 在运行Maven时,Maven所需的任何组件都直接从本地仓库获得。如果本地仓库没有,它将首先尝试将组件从远程仓库下载到本地仓库,然后使用本地仓库中的组件。 默认情况下,无论是Linux还是Windows,每个用户都有一个名为的仓库目录。m2/repository/位于自己的用户目录下。 Maven本地仓库由default_ HOME%目录在%USER中创建。要修改默认位置,请在%M2_另一个路径在HOME%conf目录中Maven的settings.xml文件中定义。
Maven有以下三个标准生命周期: 清洁:项目清洁 默认(或生成):处理项目部署 站点:处理项目站点文档创建 每个生命周期包含一系列阶段。这些阶段相当于Maven提供的统一接口,这些阶段的实现由Maven插件完成。 当我们输入mvn命令(如mvn clean)时,clean对应于clean生命周期中的clean阶段。然而,clean的具体操作由maven clean插件实现。 因此,Maven生命周期每个阶段的具体实现是由Maven插件实现的。 Maven实际上是一个依赖插件执行的框架,每个任务实际上都是由插件完成的。Maven插件通常用于: 创建jar文件 创建战争文件 编译代码文件 代码单元测试 创建项目文档 创建项目报告 插件通常提供目标集合,可以使用以下语法执行:
<dependencies>
<dependency>
<groupId>com.companyname.groupname2</groupId>
<artifactId>Lib2</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname3</groupId>
<artifactId>Lib3</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
插件是使用plugins元素在pom.xml中定义的。 每个插件可以有多个目标。 可以定义阶段,插件将使用其阶段元素开始处理。我们使用了清洁阶段。 可以通过绑定到插件的目标来配置要执行的任务。我们已经将echo任务绑定到maven antrun插件的运行目标。 就这样。Maven将处理剩下的问题。它将下载本地存储库中不可用的插件并开始处理。