在 Ubuntu 中安装 Maven

2025年3月17日 | 阅读11分钟

什么是 Maven?

Maven 是一个自动化构建工具,主要用于 Java 项目。它还可以用于构建和管理使用 Scala、Ruby、C# 等语言编写的项目。Maven 项目由 Apache 软件基金会托管,曾是 Jakarta 项目的一部分。

Maven 定义了软件构建的两个方面:软件如何构建及其依赖。与 Apache Ant 等早期工具不同,它对构建过程应用了约定。只需要描述例外情况。一个 XML 文件定义了要构建的软件项目及其对许多其他外部组件和模块的依赖、构建目录、顺序以及所需的插件。它提供了预定义的代码和打包。

  • Maven 会动态地从 Maven 2 Central Repository 等多个存储库下载 Maven 插件和 Java 库,并将它们保存在本地缓存中。
  • 此外,此本地缓存中的已安装构件还可以用本地项目创建的许多构件进行更新。
  • 此外,公共存储库也可以更新。
  • Maven 采用 插件架构 构建,允许它使用一个可从标准输入控制的应用程序。
  • Maven 2 组织了 C/C++ 的原生插件。
  • 许多替代技术,如 sbtGradle,因为它们是构建工具,不依赖于 XML,但拥有 Maven 引入的关键概念。
  • 开发了一个依赖管理器,它也支持 Maven 的存储库以及 Apache Ivy。

Maven 的历史

Maven 由 Jason van Zyl 创建,于 2002 年作为 Apache Turbine 的子项目启动。它于 2003 年被投票并采纳为 Apache 软件基金会的顶级项目。Maven 的发布 v1.0 是一个重要的里程碑,于 2004 年 7 月发布。在经过大约 6 个月的 Beta 测试周期后,Maven 2 于 2005 年 10 月宣布了 v2.0。Maven 3.0 于 2010 年 10 月发布,与 Maven 的第二版高度向后兼容。

2018 年,Maven 3.0 的信息开始流出。在经历了 8 个 Alpha 版本后,Maven 3.0 的第一个 Beta 版本于 2010 年 4 月发布。Maven 3.0 重构了核心项目构建器基础设施,提供了 POM 的基于文件的表示,并通过其内存对象表示进行了解耦。这增加了 Maven 3.0 的附加组件利用非 XML 的项目定义文件的可能性。建议的语言包括 Groovy、YAML 和 Ruby。

  • 特别注意确保 Maven 3 与 Maven 2 的向后兼容性。
  • 对于几乎所有项目,切换到 Maven 3 都无需调整项目结构。
  • 第一个 Maven 3 Beta 版本引入了并行构建功能,该功能可以利用机器上任何可配置数量的核心(多核),特别适合大型多模块项目。

Maven 的互操作性

针对 Java 的各种著名 IDE(集成开发环境)的附加组件提供了 Maven 与 IDE 的源代码编辑和构建机制工具的集成,允许 Maven 在 IDE 内部安排项目,并配置代码补全类路径,聚焦编译器错误等。
一些著名的 IDE 支持使用 Maven 进行开发,例如:

  • Visual Studio Code
  • MyEclipse
  • JDeveloper
  • JBuilder
  • IntelliJ IDEA
  • NetBeans
  • Eclipse

此外,这些附加组件还允许直接在 IDE 中使用 POM 或修改 POM 来确定项目依赖项的完整集合。当 IDE 不再执行编译时,一些 IDE 的内置功能将缺失。例如,Eclipse 的 JDT 可以在单个 Java 源文件被修改后重新编译它。许多 IDE 使用一组扁平的项目而不是 Maven 支持的文件夹层次结构进行操作。当在 IDE 中使用 Maven 时,这会使 SCM 系统的利用变得复杂。

Maven 的目标

Maven 的主要目标是让开发人员在最短的时间内整合开发工作的全部状态。Maven 致力于达成此目标,涉及多个方面:

  • 简化构建过程: 使用 Maven 并不意味着不需要了解其基本机制。Maven 确实能保护开发人员免受许多细节的困扰。
  • 鼓励开发实践: Maven 专注于收集当前最佳开发实践的规则,并方便地以此方式指导项目。
    例如,单元测试的规范、实现和报告是 Maven 常见构建周期的一部分。已将一些当前单元测试的最佳实践作为指导方针应用:
    • 包含结构化其环境的测试用例,而不是为测试准备定制创建。
    • 使用测试用例的命名约定来查找和运行测试。
    • 将测试的源代码保存在一个隔离的、但并行的源树中。
    此外,Maven 还有助于项目工作流,例如问题跟踪和版本管理。
    Maven 还对如何设计项目目录结构提出了一些指导方针。一旦我们熟悉了这种设计,就可以轻松管理其他使用 Maven 的项目。
    有些项目可能不适合这种结构,尽管 Maven 对项目设计采取了一种有主见的做法。虽然 Maven 是为了可扩展性而设计的,以满足多个项目的需求,但它无法在不干扰其目标的情况下满足所有情况。
  • 提供可靠的构建系统: Maven 使用其 POM(项目对象模型)和一组插件来构建项目。一旦熟悉了一个 Maven 项目,就知道如何构建所有 Maven 项目。这可以节省在不同项目之间导航的时间。
  • 提供高质量的项目详情: Maven 提供有用的项目信息,这些信息部分通过我们的 POM 获取,部分从我们的项目源代码生成。例如,Maven 可以提供以下信息:
    • 单元测试详细信息,如覆盖率。
    • 项目使用的依赖项。
    • 项目处理的邮件列表。
    • 交叉引用的源代码。
    • 直接从源代码控制生成的更改日志。

此外,第三方代码分析提供了 Maven 插件,它们会将报告包含在 Maven 提供的典型信息中。

Maven 的特点

以下是 Maven 的一些重要特点:

  • 遵循最佳实践的简单项目设置 - 新模块或项目可在几秒钟内启动。
  • 在所有项目中的持续一致性。这意味着新加入项目的开发人员无需重新学习。
  • 依赖管理,包括依赖闭包(也称为传递性依赖)和自动更新。
  • 可以轻松地同时处理两个或多个项目。
  • 拥有一个不断增长的大型元数据和库存储库,可开箱即用,并提供了与最大的开源项目合作的机制,以保证其最新版本的可用性。
  • 几乎无需额外配置即可即时访问许多功能。
  • 可扩展,能够轻松地使用脚本或 Java 语言编写插件。
  • 用于 Maven 外部的依赖部署和管理的 Ant 操作。
  • Maven 采用基于模型的构建,因为它可以根据项目元数据将多个项目创建为多种预定义的输出类型,包括分发版、WAR 或 JAR,几乎不需要实现脚本。
  • Maven 可以生成 PDF 或网站,例如我们希望包含的任何文档,并包含有关项目开发状态的报告,其中包含与构建过程相似的元数据。这些信息的示例可以在网站左侧导航底部的“项目报告”“项目信息”中找到。
  • Maven 将与我们的源代码控制系统(如 Git 或 Subversion)协调,并根据某些规则处理项目发布,而无需太多额外配置。此外,它可以将其发布到分发位置供其他项目使用。Maven 可以发布单个输出,包括源代码分发版和 JAR,后者是一个包含文档和其他依赖项的存档。
  • Maven 鼓励使用中央 JAR 存储库和其他依赖项。它提供了一个机制,我们的项目客户可以使用该机制下载构建我们的项目所需的 JAR,就像 Perl 的 CPAN 一样。它允许 Maven 用户在项目之间重用 JAR,并促进项目通信,以确保处理向后兼容性问题。

Maven 的设计

Install Maven in Ubuntu

项目对象模型 (POM)

一个项目对象模型用于处理一个项目的每个配置。基本配置涵盖项目名称、其依赖项以及它对其他项目的依赖。此外,还可以配置构建过程的单个阶段,这通过插件来实现。例如,可以使用编译器的 1.5 版 Java 来构造编译器插件进行编译,或者即使一些单元测试失败,也可以描述项目的打包。

大型项目应分为多个子项目和模块,每个模块都有自己的POM。然后,可以指定一个根 POM,从中可以使用一个命令编译所有模块。此外,POM 可以从任何其他 POM 继承配置。每个 POM 默认从其超级 POM 继承。超级 POM 提供默认配置,如默认插件、默认源目录等。

POM 是“Project Object Model”的缩写。它是 Maven 项目的 XML 表示,存储在名为 pom.xml 的文件中。一个项目包含配置文件、关联的开发人员、缺陷跟踪系统、许可证、组织、项目 URL、项目依赖项以及为代码提供生命力的所有其他小部分。它是与项目相关的所有内容的“一站式商店”。在 Maven 世界中,一个项目甚至不需要包含代码,只需要一个 pom.xml 文件。

Maven 坐标

POM 是 Maven 允许的最低限度:groupId:artifactId:version 是所有必需的字段(但是,如果版本和 groupId 是从父级继承的,则不需要显式定义)。这三个字段非常像时间戳和地址的结合。它标记了存储库中的一个特定位置,就像一个坐标系统一样。

  • groupId: 通常,它在项目或组织内是唯一的。例如,Maven 的所有核心构件都位于 org.apache.maven groupId 下。组 ID 不一定要使用点表示法,例如 junit 项目。请注意,带点号的 groupId 不必与项目包含的包结构相似。但是,考虑这一点是一个好习惯。
    该组非常类似于 Java 包结构在存储库中保存的 OS 中的行为方式。点号被特定目录的操作系统分隔符替换,这在基本存储库中成为相应的目录结构。在本例中,该组(即 org.codehaus.mojo)位于 $M2_REPO/org/codehaus/mojo 目录中。
  • artifactId: 通常,这个 artifactId 是项目调用的名称。组中的人们将在会话中指定 groupId(通常,它们是相同的 ID,如 org.codehaus.mojo MojoHaus 项目 groupId),尽管 groupId 很重要。与 groupId 一起,它构成了一个密钥,将该项目与世界上所有其他项目区分开来。artifactId 在存储库中与 groupId 一起完全指定了构件的居住空间。
  • version: 这是命名难题的最后一部分。groupId:artifactId 指定了一个单独的项目,但它无法定义我们正在讨论的项目哪个版本。此外,它在构件的存储库中用于隔离版本。

插件

Maven 的大部分功能都在插件中。插件提供了一组可以通过 mvn [plugin-name] : [goal-name] 命令运行的目标。例如,可以通过执行 mvn compiler:compile 命令来编译 Java 项目,使用编译器的 compile-goal。

有许多 Maven 插件用于构建、测试、运行 Web 服务器、源代码管理、生成 Eclipse 项目文件等。这些插件在 pom.xml 文件的 部分进行配置和引入。

一些基本插件默认添加到所有项目中,并具有合乎逻辑的默认设置。但是,如果软件项目的打包、测试和构建的原型构建顺序需要手动执行所有相应的目标,那将很不方便。

  • mvn compiler:compile
  • mvn surefire:test
  • mvn jar:jar

Maven 的生命周期概念解决了这个问题。

插件是扩展 Maven 的主要方式。集成 Maven 插件可以通过扩展 org.apache.maven.plugin.AbtractMojo 类来实现。

构建生命周期

这是一个命名的阶段列表,可用于为目标执行排序。Maven 的标准生命周期之一是默认生命周期,它按特定顺序包含一些阶段,如下所述:

  • 生命周期 1: validate
  • 生命周期 2: generate-sources
  • 生命周期 3: process-sources
  • 生命周期 4: generate-resources
  • 生命周期 5: process-resources
  • 生命周期 6: compile
  • 生命周期 7: process-test-sources
  • 生命周期 8: process-test-resources
  • 生命周期 9: test-compile
  • 生命周期 10: test
  • 生命周期 11: package
  • 生命周期 12: install
  • 生命周期 13: deploy

来自插件的目标可以与不同的生命周期阶段关联。例如,compiler:compile 目标默认与 compile 阶段关联,而 surefire:test 目标与 test 阶段关联。当运行 mvn test 命令时,Maven 会执行连接到所有阶段直到并包括 'test' 阶段的所有目标。

Maven 执行与 process-resources 阶段关联的 resources:resources 目标,然后是 compiler:compile 等,直到最后执行 surefire:test 目标。

此外,Maven 还包含用于清理项目和生成项目站点的标准阶段。如果清理是默认生命周期的一部分,项目将在每次创建时都被清理。这是不希望的,因此清理被提供了自己的生命周期。

依赖关系

依赖管理是 Maven 的核心方面。Maven 的依赖处理机制围绕一个识别单个构件(如软件模型或库)的坐标系统进行组织。

在 Ubuntu 20.04 中安装 Maven

Apache Maven 是一个独特的、先进的项目构建工具,通常与 Java 相关。它是一个开源工具,使用包含 XML 文件的项目对象模型来存储项目的重要信息,最终包含与艺术项目、配置文件及其依赖项相关的信息。

为了有效地在 Ubuntu 20.04 版本上安装 Maven,我们将需要对 Linux 命令和工作原理有基本了解,能够识别 sudo 命令,并拥有 root 用户权限。该工具旨在通过有效地报告和记录核心项目信息来帮助用户构建项目。

Maven 被认为是管理 Java 项目的最佳工具。此外,它包含内置的对象命令,用于处理代码组合和包。

Maven 的安装过程

Maven 的安装过程主要由三个基本步骤组成。在开始这三个步骤之前,我们可以利用 Maven 的所有优势来管理我们的 Ubuntu 系统上的 Java 项目。

步骤 1:包升级

步骤 2:Apache Maven 安装

步骤 3:验证

前提条件

为了执行 Maven 命令,我们的服务器必须安装 Java,其中包含 JRE 和 JDK 开发工具包。如果我们的系统没有安装 Java,那么我们可以在终端窗口中运行以下命令:


Install Maven in Ubuntu

我们还可以通过以下命令验证 Java 系统安装及其套件:


Install Maven in Ubuntu

步骤 1:包升级

首先,我们需要使用 sudo apt 命令更新现有包。在 Ubuntu 系统上安装任何服务器或工具之前,更新现有包是至关重要的。命令如下:


Install Maven in Ubuntu

我们也可以在安装 Java 套件之前执行此命令。通过这种方式,系统包将与Java 套件的安装一起更新。

步骤 2:Apache Maven 安装

主要有两种方法可以在我们的系统中获取 Maven。一种是使用 apt 命令下载,另一种是直接使用 wget 命令从其 Web 来源下载。

我们需要在终端窗口中运行以下命令来安装 Maven:


Install Maven in Ubuntu

步骤 3:验证

我们也可以在终端窗口中使用以下命令来验证 Maven 安装:


Install Maven in Ubuntu