maven
Maven是一个主要用于Java项目的构建自动化工具。它有助于管理构建过程,包括编译源代码、运行测试、将编译后的代码打包成JAR文件以及管理依赖项。Maven使用项目对象模型(POM)文件来描述项目配置和依赖关系。
Maven通过提供标准的项目组织方式和管理依赖项,简化了构建过程,使开发人员能够更轻松地处理不同的项目并与他人合作。
Maven的一些关键特性包括:
1. 依赖管理:Maven可以自动从远程存储库下载和管理项目依赖项。
2. 一致的项目结构:Maven强制执行标准的项目结构,使开发人员更容易理解和处理不同的项目。
3. 构建生命周期:Maven定义了一组构建阶段(例如编译、测试、打包),并提供插件在每个阶段执行任务。
4. 可扩展性:Maven可以通过自定义插件进行扩展,以支持额外的构建任务。
表现形式
由于实际开发时我们往往都会整合使用很多大型框架,所以一个项目中哪怕只是一个模块也会涉及到大量 jar 包。数以百计的 jar 包要彼此协调、精密配合才能保证程序正常运行。而规模如此庞大的 jar 包组合在一起难免会有磕磕碰碰。最关键的是由于 jar 包冲突所导致的问题非常诡异,这里我们只能罗列较为典型的问题,而没法保证穷举。
但是我们仍然能够指出一点:一般来说,由于我们自己编写代码、配置文件写错所导致的问题通常能够在异常信息中看到我们自己类的全类名或配置文件的所在路径。如果整个错误信息中完全没有我们负责的部分,全部是框架、第三方工具包里面的类报错,这往往就是 jar 包的问题所引起的。
而具体的表现形式中,主要体现为找不到类或找不到方法。
抛异常:找不到类
此时抛出的常见的异常类型:
java.lang.ClassNotFoundException:编译过程中找不到类
java.lang.NoClassDefFoundError:运行过程中找不到类
java.lang.LinkageError:不同类加载器分别加载的多个类有相同的全限定名
私服
1. 私服介绍
Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。
建立了 Maven 私服后,当局域网内的用户需要某个构件时,会按照如下顺序进行请求和下载。
请求本地仓库,若本地仓库不存在所需构件,则跳转到第 2 步;
请求 Maven 私服,将所需构件下载到本地仓库,若私服中不存在所需构件,则跳转到第 3 步。
请求外部的远程仓库,将所需构件下载并缓存到 Maven 私服,若外部远程仓库不存在所需构件,则 Maven 直接报错。
此外,一些无法从外部仓库下载到的构件,也能从本地上传到私服供其他人使用。
下图中展示了 Maven 私服的用途。
Nexus 仓库分类
Nexus 仓库按照类型(Type)区分,主要分为以下 3 个类型:
代理仓库(proxy):用来代理远程公共仓库,如 Maven 中央仓库。
宿主仓库(hosted):又称 Nexus 本地仓库,该仓库通常用来部署本地项目所产生的构件。
仓库组(group):用来聚合代理仓库和宿主仓库,为这些仓库提供统一的服务地址,以便 Maven 可以更加方便地获得这些仓库中的构件。
为了更加直观的理解仓库组、代理仓库和宿主仓库的概念,我们通过下图展示它们的用途和区别。
由上图可知:
Maven 可以直接从宿主仓库中下载构件。
Maven 也可以从代理仓库中下载构件,代理仓库会从远程仓库下载并缓存构件。
Maven 还可以从仓库组中下载构件,仓库组会从其包含的宿主仓库和代理仓库中获取构件。