Maven教程
Maven是用于Java软件项目的强大构建工具。实际上,我们也可以使用其他语言来构建软件项目,但是Maven是用Java开发的,因此,从历史上看,Maven被更多地用于Java项目。
本Maven教程的目的是使我们了解Maven的工作方式。因此,本教程重点介绍Maven的核心概念。一旦了解了核心概念,就可以更轻松地在Maven文档中查找详细信息,或者在Internet上进行搜索。
实际上,Maven开发人员声称Maven不仅仅是一个构建工具。我们可以在他们的《 Maven哲学》一书中阅读他们所相信的东西。但就目前而言,只需将其视为构建工具即可。了解并开始使用它后,我们将了解Maven的真正含义。
Maven版本
该Maven教程的第一个版本基于Maven 3.0.5. 但是,自本教程的第一个版本以来,本教程已在多个地方进行了更新。此更新已使用Maven 3.3.3进行了测试。
Maven网站
Maven网站位于:
http://maven.apache.org
从此网站上,我们可以下载最新版本的Maven并大致上遵循该项目。
什么是构建工具?
构建工具是一种工具,它可以自动完成与构建软件项目相关的所有操作。构建软件项目通常包括以下一项或者多项活动:
- 生成源代码(如果项目中使用了自动生成的代码)。
- 从源代码生成文档。
- 编译源代码。
- 将编译后的代码打包到JAR文件或者ZIP文件中。
- 在服务器,存储库或者其他地方安装打包的代码。
任何给定的软件项目可能具有比完成最终软件所需的更多活动。通常可以将此类活动插入构建工具中,因此也可以将这些活动自动化。
自动化构建过程的优势在于,我们可以在人工构建软件时最大程度地减少人为错误的风险。此外,自动化构建工具通常比人工手动执行相同步骤的速度更快。
安装Maven
要在我们自己的系统(计算机)上安装Maven,请转至Maven下载页面并按照其中的说明进行操作。总之,我们需要做的是:
- 将环境变量" JAVA_HOME"设置为指向有效的Java SDK(例如Java 8)。
- 下载并解压缩Maven。
- 将M2_HOME环境变量设置为指向我们将Maven解压缩到的目录。
- 设置环境变量" M2"指向" M2_HOME / bin"(在Windows上为"%M2_HOME%\ bin",在Unix上为" $ M2_HOME / bin")。
- 将M2添加到PATH环境变量中(在Windows上为%M2%,在Unix上为$ M2)。
- 打开命令提示符,然后键入"
mvn -version
"(不带引号),然后按Enter。
输入mvn -version
命令后,我们应该能够看到Maven执行,并且Maven的版本号被写到命令提示符中。
注意:Maven在执行时使用Java,因此我们也需要安装Java(以及如上所述设置的JAVA_HOME环境变量)。 Maven 3.0.5需要Java 1.5或者更高版本。我将Maven 3.3.3与Java 8(u45)结合使用。
如果我们不熟悉Java SDK,我有一个有关安装Java SDK的教程。请记住,它必须是一个SDK(软件开发工具包),而不仅仅是JRE(Java运行时环境)。 JRE不包含Java编译器。只有SDK可以。
Maven概述-核心概念
Maven围绕着POM文件(项目对象模型)的概念。 POM文件是项目资源(如源代码,测试代码,依赖项(使用的外部JAR)等)的XML表示。POM包含对所有这些资源的引用。 POM文件应位于其所属项目的根目录中。
POM文件执行Maven命令时,为Maven提供一个POM文件以执行命令。然后,Maven将在POM中描述的资源上执行命令。
构建生命周期,阶段和目标Maven的构建过程分为构建生命周期,阶段和目标。构建生命周期包含一系列构建阶段,每个构建阶段都包含一系列目标。当我们运行Maven时,我们将命令传递给Maven。此命令是构建生命周期,阶段或者目标的名称。如果请求执行生命周期,则将执行该生命周期中的所有构建阶段。如果请求执行一个构建阶段,那么还将按照预定义的构建阶段顺序执行所有在其之前的构建阶段。
依赖关系和存储库Maven执行的首要目标之一是检查项目所需的依赖关系。依赖关系是项目使用的外部JAR文件(Java库)。如果在本地Maven存储库中未找到依赖项,则Maven从中央Maven存储库下载它们并将其放在本地存储库中。本地存储库只是计算机硬盘上的目录。我们可以指定本地存储库的位置(我愿意)。我们还可以指定用于下载依赖项的远程存储库。所有这些都将在本教程的后面部分更详细地说明。
构建插件构建插件用于将额外的目标插入构建阶段。如果我们需要为项目执行一组标准Maven构建阶段和目标未涵盖的操作,则可以将插件添加到POM文件。 Maven有一些可以使用的标准插件,如果需要,我们也可以用Java实现自己的插件。
构建配置文件如果需要以不同方式构建项目,则使用构建配置文件。例如,我们可能需要为本地计算机构建项目,以进行开发和测试。并且我们可能需要构建它以便在生产环境中进行部署。这两个版本可能有所不同。要启用不同的构建,可以将不同的构建配置文件添加到POM文件。执行Maven时,我们可以确定要使用的构建配置文件。
Maven与蚂蚁
Ant是Apache另一个流行的构建工具。如果我们习惯了Ant并且尝试学习Maven,那么我们会注意到这两个项目的方法有所不同。
Ant使用命令式方法,这意味着我们在Ant构建文件中指定Ant应该采取的操作。我们可以指定低级操作,例如复制文件,编译代码等。我们可以指定操作,还可以指定执行操作的顺序。 Ant没有默认目录布局。
Maven使用更具声明性的方法,这意味着我们可以在Maven POM文件中指定要构建的内容,而不是如何构建它。 POM文件描述了项目资源,而不是如何构建它。相反,Ant文件描述了如何构建项目。在Maven中,如何构建项目已在Maven构建生命周期,阶段和目标中进行了预定义。
Maven POM文件
Maven POM文件(项目对象模型)是描述项目资源的XML文件。这包括源代码,测试源等所在的目录,项目具有哪些外部依赖项(JAR文件)等。
POM文件描述了要构建的内容,但通常不描述如何构建。如何构建它取决于Maven的构建阶段和目标。不过,我们可以根据需要将自定义操作(目标)插入Maven构建阶段。
每个项目都有一个POM文件。 POM文件名为pom.xml
,应位于项目的根目录中。分为子项目的项目通常会为父项目有一个POM文件,为每个子项目有一个POM文件。这种结构既可以在一个步骤中构建整个项目,也可以单独构建任何子项目。
在本节的其余部分中,我将描述POM文件中最重要的部分。有关POM文件的完整参考,请参见《 Maven POM参考》。
这是一个最小的POM文件:
<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.Hyman</groupId> <artifactId>java-web-crawler</artifactId> <version>1.0.0</version> </project>
modelVersion元素设置我们使用的POM模型的版本。使用与我们使用的Maven版本匹配的版本。版本4.0.0与Maven版本2和3.
" groupId"元素是组织或者项目(例如,开源项目)的唯一ID。大多数情况下,我们将使用与项目的根Java包名称相似的组ID。例如,对于我的Java Web Crawler项目,我可以选择组ID" com.Hyman"。如果该项目是具有许多独立贡献者的开源项目,那么使用与该项目相关的组ID而不是与我公司相关的组ID可能更有意义。因此,可以使用com.javawebcrawler。
组ID不必是Java包名称,也不需要使用。符号(点符号)用于分隔ID中的单词。但是,如果这样做,该项目将位于Maven存储库中与组ID匹配的目录结构下。每个 。用目录分隔符替换,因此每个单词代表一个目录。然后,组ID" com.Hyman"将位于名为" MAVEN_REPO / com / Hyman"的目录中。目录名的" MAVEN_REPO"部分将被Maven存储库的目录路径替换。
" artifactId"元素包含我们正在构建的项目的名称。在我的Java Web Crawler项目中,工件ID为java-web-crawler
。工件ID用作Maven存储库中组ID目录下子目录的名称。构件ID也用作构建项目时生成的JAR文件名的一部分。生成过程的输出(即生成结果)在Maven中称为工件。通常,它是JAR,WAR或者EAR文件,但也可能是其他文件。
versionId
元素包含项目的版本号。如果项目以不同的版本(例如,开源API)发布,则对构建进行版本控制非常有用。这样,项目的用户可以引用项目的特定版本。版本号用作工件ID目录下的子目录的名称。版本号也用作所构建工件名称的一部分。
上面的groupId
,artifactId
和version
元素将生成一个JAR文件,并将其放入以下路径(目录和文件名)中的本地Maven存储库中:
MAVEN_REPO/com/Hyman/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar
如果项目使用Maven目录结构,并且项目没有外部依赖项,那么上面的最小POM文件就是构建项目所需的全部。
如果项目不遵循标准目录结构,具有外部依赖性或者在构建过程中需要采取特殊措施,则需要向POM文件中添加更多元素。这些元素在Maven POM参考中列出(请参见上面的链接)。
通常,我们可以在POM中指定很多内容,这为Maven提供了有关如何构建项目的更多详细信息。有关可以指定的内容的更多信息,请参见Maven POM参考。
超级POM
所有Maven POM文件都从超级POM继承。如果未指定超级POM,则POM文件将从基本POM继承。
我们可以使POM文件显式继承自另一个POM文件。这样,我们可以通过其通用的超级POM在所有继承的POM上更改设置。我们可以在POM文件的顶部指定超级POM,如下所示:
<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> <parent> <groupId>org.codehaus.mojo</groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <relativePath>../my-parent</relativePath> </parent> <artifactId>my-project</artifactId> ... </project>
继承的POM文件可能会覆盖超级POM中的设置。只需在继承的POM文件中指定新设置即可。
Maven POM参考中也更详细地介绍了POM继承。
有效POM
通过所有这些POM继承,可能很难知道Maven执行时整个POM文件的外观。整个POM文件(所有继承的结果)称为有效POM。我们可以使用以下命令让Maven向我们展示有效的POM:
mvn help:effective-pom
该命令将使Maven将有效的POM写入命令行提示符。
Maven设置文件
Maven有两个设置文件。在设置文件中,我们可以在所有Maven POM文件中配置Maven的设置。例如,我们可以配置:
- 本地存储库的位置
- 活动的构建配置文件
- 等等。
设置文件称为" settings.xml"。这两个设置文件位于:
- Maven安装目录:$ M2_HOME / conf / settings.xml
- 用户的主目录:
$ {user.home} /。m2 / settings.xml
这两个文件都是可选的。如果两个文件都存在,则用户主目录设置文件中的值将覆盖Maven安装设置文件中的值。
运行Maven
安装Maven并创建POM文件并将POM文件放入项目的根目录后,即可在项目上运行Maven。
运行Maven是通过在命令提示符下执行mvn
命令来完成的。当执行mvn
命令时,我们将生成生命周期,阶段或者目标的名称传递给它,然后由Maven执行。这是一个例子:
mvn install
该命令执行称为"安装"的构建阶段("缺省"构建生命周期的一部分),该阶段将构建项目并将打包的JAR文件复制到本地Maven存储库中。实际上,此命令会在执行安装阶段之前在安装阶段顺序中执行所有安装阶段。
我们可以通过将多个参数传递给mvn
命令来执行多个构建生命周期或者阶段。这是一个例子:
mvn clean install
该命令首先执行" clean"构建生命周期,该生命周期将从Maven输出目录中删除已编译的类,然后执行" install"构建阶段。
我们还可以通过传递构建阶段和目标名称(之间用:串联)作为Maven命令的参数来执行Maven目标(构建阶段的子部分)。这是一个例子:
mvn dependency:copy-dependencies
该命令执行" dependency"构建阶段的" copy-dependencies"目标。
Maven目录结构
Maven具有标准的目录结构。如果遵循项目的目录结构,则无需在POM文件中指定源代码,测试代码等的目录。
这是最重要的目录:
- src - main - java - resources - webapp - test - java - resources - target
src目录是源代码和测试代码的根目录。 " main"目录是与应用程序本身相关的源代码(不是测试代码)的根目录。 test目录包含测试源代码。 " main"和" test"下的" java"目录包含应用程序本身的Java代码(在" main"下)和用于测试的Java代码(在测试中)。
resources
目录包含项目所需的其他资源。这可能是用于应用程序国际化的属性文件,或者其他内容。
如果项目是一个Web应用程序,则webapp
目录包含Java Web应用程序。然后," webapp"目录将成为Web应用程序的根目录。因此," webapp"目录包含" WEB-INF"目录等。
目标目录由Maven创建。它包含Maven生成的所有已编译类,JAR文件等。在执行" clean"构建阶段时,将清理" target"目录。
项目依赖
除非项目很小,否则项目可能需要打包在其自己的JAR文件中的外部Java API或者框架。当我们编译项目代码时,需要在类路径上使用这些JAR文件。
使用这些外部JAR文件的正确版本来使项目保持最新状态可能是一项全面的任务。每个外部JAR可能再次也需要其他外部JAR文件等。以递归方式下载所有这些外部依赖项(JAR文件)并确保下载正确的版本很麻烦。特别是当项目变得越来越大,并且我们获得越来越多的外部依赖关系时。
幸运的是,Maven具有内置的依赖性管理。我们可以在POM文件中指定项目所依赖的外部库以及哪个版本,然后Maven为我们下载它们并将它们放在本地Maven存储库中。如果这些外部库中的任何一个需要其他库,那么这些其他库也将下载到本地Maven存储库中。
我们可以在POM文件的dependencies
元素内指定项目依赖项。这是一个例子:
<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.Hyman.crawler</groupId> <artifactId>java-web-crawler</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> </build> </project>
注意粗体的dependencies
元素。它里面有两个" dependency"元素。每个dependency
元素都描述了一个外部依赖关系。
每个依赖项都通过其" groupId"," artifactId"和" version"进行描述。我们可能还记得,这也是我们在POM文件开头标识自己的项目的方式。上面的示例在版本1.7.1中需要org.jsoup组的jsoup工件,在版本4.8.1中需要junit组的Junit工件。
当Maven执行此POM文件时,这两个依赖项将从中央Maven存储库下载并放入本地Maven存储库。如果在本地存储库中已经找到依赖项,则Maven将不会下载它们。仅当缺少依赖项时,它们才会下载到本地存储库中。
有时,中央Maven存储库中不存在给定的依赖项。然后,我们可以自己下载依赖项,并将其放入本地Maven存储库中。请记住将其放入与groupId
,artifactId
和version
相匹配的子目录结构中。将所有点(。)替换为/,并用/分隔groupId
,artifactId
和version
。然后,我们就拥有了子目录结构。
上面的示例下载的两个依赖项将放入以下子目录中:
MAVEN_REPOSITORY_ROOT/junit/junit/4.8.1
MAVEN_REPOSITORY_ROOT/org/jsoup/jsoup/1.7.1
外部依赖
Maven中的外部依赖项是不在Maven存储库(需要本地,中央或者远程存储库)中的依赖项(JAR文件)。它可能位于本地硬盘上的某个位置,例如在Webapp的lib目录中,或者其他位置。因此,"外部"一词意味着在Maven存储库系统外部,而不仅仅是项目外部。大多数依赖项在项目外部,而很少依赖项在存储库系统外部(不在存储库中)。
我们可以这样配置外部依赖项:
<dependency> <groupId>mydependency</groupId> <artifactId>mydependency</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath> </dependency>
groupId和artifactId都设置为依赖项的名称。即所使用的API的名称。 " scope"元素值设置为" system"。将systemPath元素设置为指向包含依赖项的JAR文件的位置。 $ {basedir}指向POM所在的目录。其余路径是相对于该目录的。
快照依存关系
快照依赖项是正在开发的依赖项(JAR文件)。我们可以依靠项目的快照版本来代替不断更新版本号以获得最新版本。对于每个内部版本,始终都会将快照版本下载到本地存储库中,即使本地存储库中已存在匹配的快照版本也是如此。始终下载快照依赖项,以确保对于每个内部版本,本地存储库中始终具有最新版本。
我们可以通过在POM开头的版本号后添加-SNAPSHOT来告诉Maven项目是快照版本(我们还可以其中设置groupId和artifactId)。这是一个version
元素的例子:
<version>1.0-SNAPSHOT</version>
注意版本号后面的-SNAPSHOT
。
在配置依赖项时,还可以通过在版本号后添加-SNAPSHOT
来完成取决于快照版本的操作。这是一个例子:
<dependency> <groupId>com.Hyman</groupId> <artifactId>java-web-crawler</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
版本号后面的-SNAPSHOT告诉Maven这是快照版本。
我们可以在Maven设置文件中配置Maven多久下载一次快照依赖项。
传递依存关系
如果项目依赖于一个依赖关系,例如Dependency ABC,而依赖关系ABC本身依赖于另一个依赖关系,例如Dependency XYZ,则项目对Dependency XYZ具有传递依赖。
排除依赖
有时,项目的直接依赖项可能会与直接依赖项的传递性依赖项发生冲突。例如,我们可能正在使用JAX-RS实现,该实现内部使用了旧版本的Hymanson JSON Toolkit。但是,应用程序可能正在使用Hymanson JSON Toolkit的较新版本。我们如何知道将使用两个版本中的哪个版本?
一个解决方案是为JAX-RS依赖关系指定应排除其对较早版本的Hymanson JSON Toolkit的依赖关系。这也称为依赖排除。
我们可以在相关性声明中指定要排除的相关性排除项。这是一个声明Maven依赖关系排除的示例:
<dependency> <groupId>example.jaxrs</groupId> <artifactId>JAX-RS-TOOLKIT</artifactId> <version>1.0</version> <scope>compile</scope> <exclusions> <exclusion> <groupId>com.fasterxml.Hymanson.core</groupId> <artifactId>Hymanson-core</artifactId> </exclusion> </exclusions> </dependency>
有了此依赖项排除声明后,在Maven编译项目期间,将忽略包含该排除项的依赖项正在使用的任何版本的排除依赖项。
Maven仓库
Maven存储库是带有额外元数据的打包JAR文件的目录。元数据是POM文件,描述每个打包的JAR文件所属的项目,包括每个打包的JAR具有哪些外部依赖项。正是这些元数据使Maven可以递归下载依赖项的依赖项,直到整个依赖项树都被下载并放入本地存储库中为止。
Maven存储库简介中对Maven存储库进行了更详细的介绍,但这是一个快速概述。
Maven具有三种类型的存储库:
- 本地仓库
- 中央仓库
- 远程仓库
Maven按上述顺序在这些存储库中搜索依赖项。首先在本地存储库中,然后在中央存储库中,如果在POM中指定,则在远程存储库中第三。
本地存储库本地存储库是开发人员计算机上的目录。该存储库将包含Maven下载的所有依赖项。相同的Maven存储库通常用于几个不同的项目。因此,即使多个项目依赖于Maven(例如Junit),Maven也只需要下载一次依赖项。
我们还可以使用mvn install
命令来构建我们自己的项目并将其安装在本地存储库中。这样,其他项目就可以通过将自己项目的打包JAR文件指定为Maven POM文件中的外部依赖项来将其用作外部依赖项。
默认情况下,Maven将本地存储库放在本地计算机上的用户主目录中。但是,我们可以通过在Maven设置文件中设置目录来更改本地存储库的位置。Maven设置文件也位于" user-home / .m2"目录中,称为" settings.xml"。这是我们为本地存储库指定另一个位置的方式:
<settings> <localRepository> d:\data\java\products\maven\repository </localRepository> </settings>
中央存储库中央Maven存储库是Maven社区提供的存储库。默认情况下,Maven在此中央存储库中查找所需的任何依赖关系,但在本地存储库中找不到。然后,Maven将这些依赖项下载到本地存储库中。我们无需特殊配置即可访问中央存储库。
远程存储库远程存储库是Web服务器上的存储库,Maven可以从中下载依赖项,就像中央存储库一样。远程存储库可以位于Internet上的任何位置,也可以位于本地网络内。
远程存储库通常用于托管组织内部的项目,这些项目由多个项目共享。例如,一个公共安全项目可能会在多个内部项目中使用。该安全项目不应为外界所访问,因此不应托管在公共的中央Maven存储库中。而是可以将其托管在内部远程存储库中。
Maven还将下载在远程存储库中找到的依赖项,并将其放入本地存储库中。
我们可以在POM文件中配置远程存储库。将以下XML元素放在<dependencies>
元素之后:
<repositories> <repository> <id>Hyman.code</id> <url>http://maven.Hyman.com/maven2/lib</url> </repository> </repositories>
Maven构建生命周期,阶段和目标
当Maven构建软件项目时,它遵循构建生命周期。构建生命周期分为构建阶段,构建阶段分为构建目标。 Maven构建生命周期,构建阶段和目标在" Maven构建阶段简介"中有更详细的描述,但是在这里,我将为我们提供快速概述。
构建生命周期Maven具有3个内置的构建生命周期。这些是:
- default
- clean
- site
这些构建生命周期中的每一个都照顾到构建软件项目的不同方面。因此,这些构建生命周期中的每个生命周期都是彼此独立执行的。我们可以使Maven执行一个以上的构建生命周期,但是它们将依次执行,彼此分开,就像我们执行了两个单独的Maven命令一样。
"默认"生命周期处理与编译和打包项目有关的所有事情。 clean的生命周期处理与从输出目录中删除临时文件有关的所有事情,包括生成的源文件,编译的类,先前的JAR文件等。site的生命周期处理与为项目生成文档有关的所有事情。实际上,site
可以生成一个完整的网站,其中包含我们项目的文档。
构建阶段每个构建生命周期都分为一系列构建阶段,然后将构建阶段再次细分为目标。因此,整个构建过程是一个构建生命周期,构建阶段和目标的序列。
我们可以执行整个构建生命周期(如" clean"或者" site"),构建阶段(如" install")(是" default"构建生命周期的一部分)或者构建目标(如" dependency:copy-dependencies")。注意:我们不能直接执行"默认"生命周期。我们必须在"默认"生命周期内指定构建阶段或者目标。
执行构建阶段时,将执行此标准阶段序列中该构建阶段之前的所有构建阶段。因此,执行"安装"构建阶段实际上意味着在"安装"阶段之前执行所有构建阶段,然后在此之后执行"安装"阶段。
" default"生命周期是最令人感兴趣的,因为这是构建代码的原因。由于我们不能直接执行"默认"生命周期,因此需要从"默认"生命周期执行构建阶段或者目标。 "默认"生命周期具有广泛的构建阶段和目标序列,因此在此不再赘述。最常用的构建阶段是:
构建阶段 | 描述 |
validate | 验证项目正确,并且所有必要的信息均可用。这也确保了依赖项已下载。 |
compile | 编译项目的源代码。 |
test | 使用适当的单元测试框架针对已编译的源代码运行测试。这些测试不应要求将代码打包或者部署。 |
package | 以可分发格式(例如JAR)打包已编译的代码。 |
install | 将软件包安装到本地存储库中,以作为本地其他项目中的依赖项。 |
deploy | 将最终程序包复制到远程存储库,以便与其他开发人员和项目共享。 |
我们可以通过将其名称传递给mvn
命令来执行这些构建阶段之一。这是一个例子:
mvn package
这个例子执行了package的构建阶段,因此也执行了Maven预定义的构建阶段序列中的所有构建阶段。
如果标准的Maven构建阶段和目标不足以构建项目,则可以创建Maven插件来添加所需的额外构建函数。
构建目标构建目标是Maven构建过程中最好的步骤。一个目标可以绑定到一个或者多个构建阶段,也可以完全不绑定任何目标。如果目标未绑定到任何构建阶段,则只能通过将目标名称传递给mvn
命令来执行该目标。如果目标绑定到多个构建阶段,则该目标将在它绑定到的每个构建阶段中执行。
Maven构建配置文件
Maven构建配置文件使我们可以使用不同的配置来构建项目。无需创建两个单独的POM文件,我们只需指定具有不同构建配置的配置文件,并在需要时使用此构建配置文件构建项目。
我们可以在"个人档案"下的Maven POM参考中阅读有关构建个人档案的完整故事。在这里,我将为我们提供快速概述。
Maven构建配置文件在POM文件中的profiles
元素内指定。每个构建配置文件都嵌套在一个profile
元素内。这是一个例子:
<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.Hyman.crawler</groupId> <artifactId>java-web-crawler</artifactId> <version>1.0.0</version> <profiles> <profile> <id>test</id> <activation>...</activation> <build>...</build> <modules>...</modules> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <dependencies>...</dependencies> <reporting>...</reporting> <dependencyManagement>...</dependencyManagement> <distributionManagement>...</distributionManagement> </profile> </profiles> </project>
构建配置文件描述了在该构建配置文件下执行时应对POM文件进行哪些更改。这可能是在更改应用程序配置文件以供使用等。profile
元素内的元素将覆盖POM中后面具有相同名称的元素的值。
在profile
元素内,我们可以看到activation
元素。该元素描述触发此构建配置文件使用的条件。选择正在执行什么配置文件的一种方法是在settings.xml文件中。我们可以在此处设置活动配置文件。另一种方法是在Maven命令行中添加-P profile-name
。有关更多信息,请参见配置文件。
Maven插件
Maven插件使我们可以将自己的操作添加到构建过程中。为此,我们可以创建一个简单的Java类来扩展特殊的Maven类,然后为该项目创建一个POM。该插件应位于其自己的项目中。