像其他工匠一样,软件开发人员依靠他们的工具来构建应用程序。开发人员的集成开发环境(IDE),错误跟踪工具,构建工具,框架和调试工具(如内存分析器)在日常开发和质量软件维护中发挥着至关重要的作用。这本书将讨论和探索Maven的功能,我们知道这将成为您的软件开发武器库中的一个重要工具。
Apache Maven是一个开源的,基于标准的项目管理框架,简化了项目的构建,测试,报告和打包。 Maven最初的根源是在2000年初发生的Apache Jakarta Alexandria项目中。它随后在Apache Turbine项目中使用。与当时许多其他Apache项目一样,Turbine项目有几个子项目,每个子项目都有自己的基于Ant的构建系统。当时,人们强烈希望开发一种标准方法来构建项目并在项目之间轻松共享生成的工件。这个愿望诞生了Maven。 Maven 1.0版本于2004年发布,其次是2005年的2.0版本。在编写本书时,3.0.5是Maven的当前版本。
Maven已经成为全球企业中最广泛使用的开源软件程序之一。让我们来看看为什么Maven如此受欢迎的一些原因。
标准化目录结构
通常,当我们开始处理新项目时,花费大量时间来决定存储代码和配置文件所需的项目布局和文件夹结构。这些决策在不同项目和团队之间差异很大,这使得新开发人员很难理解和采用其他团队的项目。它还可以使现有开发人员难以在项目之间跳转,并找到他们正在寻找的东西。Maven通过标准化文件夹结构和项目的组织来解决上述问题。 Maven提供了关于项目的不同部分(例如源代码,测试代码和配置文件)应位于何处的建议。例如,Maven建议将所有Java源代码放在src \ main \ java文件夹中。这使得更容易理解和导航任何Maven项目。
此外,这些约定使您可以轻松地切换到并开始使用新的IDE。历史上,IDE因项目结构和文件夹名称而异。 Eclipse中的动态Web项目可能使用WebContent文件夹来存储Web资产,而NetBeans可能会将Web页面用于相同的目的。使用Maven,您的项目遵循一致的结构,并成为IDE不可知。
声明依赖管理
大多数Java项目依赖其他项目和开源框架来正常运行。手动下载这些依赖项可能很麻烦,并在项目中使用它们时跟踪它们的版本。
Maven提供了一种方便的方法在单独的外部pom.xml文件中声明这些项目依赖项。然后它会自动下载这些依赖项,并允许您在项目中使用它们。这大大简化了项目依赖管理。重要的是要注意,在pom.xml文件中,你指定的是什么,而不是如何。 pom.xml文件还可以用作文档工具,传达项目依赖项及其版本。
插件
Maven遵循基于插件的架构,使其易于扩展和自定义其功能。这些插件封装了可重用的构建和任务逻辑。今天,有数以百计的Maven插件可用于执行从代码编译到打包到项目文档生成的任务。
Maven还可以轻松创建自己的插件,从而使您能够集成特定于组织的任务和工作流程。
统一构建抽象
Maven为构建项目提供了统一的接口。你可以使用一些命令来构建一个Maven项目。一旦你熟悉了Maven的构建过程,你可以很容易地弄清楚如何构建其他Maven项目。这使开发者不必学习构建特性,因此他们可以更专注于开发。
工具支持
Maven提供了强大的命令行界面来执行不同的操作。所有主要的IDE今天为Maven提供了极好的工具支持。此外,Maven与当今的连续集成产品(如Jenkins,Bamboo和Hudson)完全集成。
原型
正如我们已经提到的,Maven为其项目提供了标准的目录布局。当创建一个新的Maven项目时,你需要手动构建每个目录,这很容易变得乏味。这是Maven原型来救援。 Maven原型是可用于生成新项目的预定义项目模板。使用原型创建的项目将包含所有您需要的文件夹和文件。
Archetypes也是捆绑最佳实践和常见资产的有用工具,您将在每个项目中使用它们。考虑一个专注于基于spring框架的Web应用程序的团队。所有基于Spring的Web项目都共享相同的依赖关系,并需要一组Spring配置文件。所有这些Web项目也极有可能具有类似的Log4j / Logback配置文件,CSS / Images和Apache Tile布局或SiteMesh装饰器。 Maven允许这个团队将这些常见资产捆绑成原型。当使用此原型创建新项目时,它们将自动包含公共资产。不再需要复制和粘贴或拖放。
开源
Maven是开源的,无需下载和使用。它具有丰富的在线文档和活跃社区的支持。此外,Sonatype等公司还为Maven生态系统提供商业支持。
公约超过配置
约定惯例配置(CoC)或按惯例编码是Maven的主要租户之一。通过Ruby on Rails社区的推广,CoC强调合理的默认值,从而减少了作出决定的数量。它节省时间并且还导致更简单的最终产品,因为所需的配置量大大减少。
作为其CoC遵守的一部分,Maven为其项目提供了几个明智的默认值。它提供了一个标准目录结构,并为生成的工件提供了默认值。想象一下用名为log4j-1.4.3.jar的Maven工件。一目了然,您可以很容易地看到,您正在查看log4j JAR文件,版本1.4.3。
Maven的CoC的一个缺点是最终用户在使用它时的刚性。为了解决这个问题,你可以自定义Maven的大多数默认值。例如,可以更改项目中Java源代码的位置。然而,作为经验法则,应该将对默认值的这种改变最小化。
Maven替代品
虽然本书的重点是Maven,让我们来看看它的几个替代品:Ant + Ivy和Gradle。
蚂蚁+常春藤
Apache Ant(http://ant.apache.org)是用于构建脚本的流行的开源工具。 Ant是基于Java的,它使用可扩展标记语言(XML)进行配置。 Ant的默认配置文件是build.xml文件。
使用Ant通常涉及定义任务和目标。顾名思义,Ant任务是需要完成的工作单元。典型的任务包括创建目录,运行测试,编译源代码,构建Web应用程序归档(WAR)文件等。目标只是一组任务。目标可能依赖于其他目标。这种依赖性使我们可以顺序执行目标。清单1-1演示了一个简单的build.xml文件,其中一个目标称为compile。编译目标有两个echo任务和一个javac任务。
列表1-1。示例Ant build.xml文件
Apache Ivy(http://ant.apache.org/ivy/)提供了自动的依赖关系管理,使得Ant更快乐地使用。使用Ivy,您可以在名为ivy.xml的XML文件中声明依赖关系,如清单1-2所示。将Ivy与Ant集成涉及在build.xml文件中声明新目标以检索和解析依赖关系。
清单1-2。样本常春藤列表
Gradle
Gradle(http://gradle.org/)是Java构建项目自动化工具系列中最新的一个。与使用XML进行配置的Ant和Maven不同,Gradle使用基于Groovy的域特定语言(DSL)。
Gradle提供了Ant的灵活性,它使用相同的任务概念。它也遵循Maven的约定和依赖管理风格。清单1-3显示了一个默认的build.gradle文件。
清单1-3。默认build.gradle文件
Gradle的DSL及其对CoC的坚持导致紧凑的构建文件。清单1-3中的第一行包括一个用于构建的Java插件。 Gradle中的插件为项目提供预配置的任务和依赖项。例如,Java插件提供了构建源文件,运行单元测试和安装工件的任务。 default.build文件中的dependencies部分指示Gradle在编译测试源文件期间使用JUnit依赖关系。 Gradle的灵活性,像蚂蚁的灵活性,可以被滥用,这导致困难和复杂的构建。
总结
Apache Maven极大地简化了构建过程并自动化了项目管理任务。本章对Maven进行了温和的介绍,并描述了采用它的主要原因。我们还看了Maven的同行:Ant + Ivy和Gradle。
在下一章中,您将了解启动和运行Maven所需的设置。