《Maven高级应用:继承聚合设计与私服Nexus实战指南》

news2025/7/15 12:49:24

一、 Maven的继承和聚合

1.什么是继承

Maven 的依赖传递机制可以一定程度上简化 POM 的配置,但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本,且这些模块之间不存在依赖关系,这就导致同一个依赖需要在多个模块中重复声明,这显然是不可取的,大量的前人经验告诉我们,重复往往意味着更多的劳动和更高的潜在风险

在 Java 面向对象中,我们可以建立一种类的父子结构,然后在父类中声明一些字段和方法供子类继承,这样就可以一定程度上消除重复,做到 “一处声明,多处使用”。在 Maven 的世界中,也有类似的机制,它就是 POM 继承。


Maven 在设计时,借鉴了 Java 面向对象中的继承思想,提出了 POM 继承思想。当一个项目包含多个模块时,可以在该项目中再创建一个父模块,并在其 POM 中声明依赖,其他模块的 POM 可通过继承父模块的 POM 来获得对相关依赖的声明。


对于父模块而言,其目的是为了消除子模块 POM 中的重复配置,其中不包含有任何实际代码,因此父模块 POM 的打包类型(packaging)必须是 pom。

如图所示:

子工程可以继承的父工程的元素:

元素

描述

groupId

项目组 ID,项目坐标的核心元素

version

项目版本,项目坐标的核心元素

description

项目的描述信息

organization

项目的组织信息

inceptionYear

项目的创始年份

url

项目的 URL 地址

developers

项目的开发者信息

contributors

项目的贡献者信息

distributionManagement

项目的部署配置

issueManagement

项目的缺陷跟踪系统信息

ciManagement

项目的持续集成系统信息

scm

项目的版本控制系统信息

mailingLists

项目的邮件列表信息

properties

自定义的 Maven 属性

dependencies

项目的依赖配置

dependencyManagement

项目的依赖管理配置

repositories

项目的仓库配置

build

包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

reporting

包括项目的报告输出目录配置、报告插件配置等

父工程示例:

父工程啥也不干,里面只要pom.xml文件即可

<modelVersion>4.0.0</modelVersion>
<groupId>com.bjpowernode</groupId>
<artifactId>maven_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式必须是pom,声明是父工程-->
<packaging>pom</packaging>

<!--聚合子模块-->
<modules>
  <module>maven_son</module>
  <module>maven_web</module>
</modules>

<properties>
  <!--定义属性,便于版本的管理-->
  <spring-version>5.3.24</spring-version>
  <servlet-version>4.0.1</servlet-version>
</properties>

<!--只是定义,并没有真正的添加依赖,子工程根据需要有选择的添加依赖-->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <!--引用定义好的属性-->
      <version>${spring-version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet-version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<build>
  <pluginManagement>
    <plugins>
      <!--只定义Tomcat插件 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8089</port>
          <url>/</url>
        </configuration>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

子工程示例:

<modelVersion>4.0.0</modelVersion>
<parent>
  <groupId>com.bjpowernode</groupId>
  <artifactId>maven_parent</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>
<!--可以省略groupId和version,因为与父工程保持一致-->
<artifactId>maven_web</artifactId>
<packaging>war</packaging>

<!--需要什么依赖,添加什么依赖,可以省略版本号,版本由父工程统一管理 -->
<dependencies>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  </dependency>
  <dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  </dependency>
</dependencies>

<build>
  <plugins>
    <!--配置Tomcat插件 -->
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <!--子工程可以自定义端口号,不自定义使用父工程的-->
      <configuration>
        <port>8060</port>
        <url>/</url>
      </configuration>
    </plugin>
  </plugins>
</build>

总结:一句话,通过继承可以实现子工程沿用父工程的配置。大大减少重复设置。

2. 什么是聚合

使用 Maven 聚合功能对项目进行构建时,需要在该项目中额外创建一个的聚合模块,然后通过这个模块构建整个项目的所有模块。聚合模块仅仅是帮助聚合其他模块的工具,其本身并无任何实质内容,因此聚合模块中只有一个 POM 文件,不包含 src 等目录。

与父模块相似,聚合模块的打包方式(packaging)也是 pom,用户可以在其 POM 中通过 modules 下的 module 子元素来添加需要聚合的模块的目录路径。父模块的 pom.xml 文件的 <modules> 把子模块聚集起来.

项目结构:

代码示例:

<modelVersion>4.0.0</modelVersion>

<groupId>com.bjpowernode</groupId>
<artifactId>maven_ju</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
  <module>../maven_02</module>
  <module>../maven_03</module>
  <module>../maven_01</module>
  <module>../maven_parent</module>
</modules>

代码结构:

总结:一句话,聚合就是集中构建项目的。

二、 Maven的私服

1.什么是私服

私服约等于镜像

Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。一些无法从外部仓库下载到的构件,也能从本地上传到私服供其他人使用。

Maven 私服其实并不是 Maven 的核心概念,它仅仅是一种衍生出来的特殊的仓库,但这并不代表它不重要,相反由于私服具有降低中央仓库负荷、节省外网带宽、以及提高项目稳定性等优点,使得私服在实际开发过程中得到了相当普遍地使用。建立了 Maven 私服后,当局域网内的用户需要某个构件时,会先请求本地仓库,若本地仓库不存在所需构件,则请求 Maven 私服,将所需构件下载到本地仓库,若私服中不存在所需构件,再去请求外部的远程仓库,将所需构件下载并缓存到 Maven 私服,若外部远程仓库不存在所需构件,则 Maven 直接报错。

2. Maven仓库管理器Nexus

⑴.什么是Nexus

Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私服,所以也有人将 Nexus 称为“Maven仓库管理器”。 Sonatype Nexus 是当前最流行,使用最广泛的 Maven 仓库管理器。Nexus 分为开源版和专业版,其中开源版足以满足大部分 Maven 用户的需求。

⑵ Nexus仓库的类型

Nexus默认内置了很多仓库,这些仓库可以划分为3种类型,每种类型的仓库用于存放特定的jar包,具体说明如下:

  1. hosted:宿主仓库,部署自己的jar包到这个类型的仓库中,包括Releases和Snapshots两部分,Releases为公司内部发行版本仓库,Snapshots为公司内部测试版本仓库。
  2. proxy: 代理仓库,用于代理远程的公共仓库,如Maven中央仓库,用户连接私服,私服自动去中央仓库下载Jar包或者插件。
  3. group:仓库组,用来合并多个hosted/proxy仓库,通常用于配置自己的Maven连接仓库组。当我们下载jar包时,从仓库组中的每个仓库找一遍,找到后下载。

通俗的语言解释这三种 Maven 仓库类型:

1. Hosted 仓库(宿主仓库)

  • 相当于你自己公司的 "内部仓库"
  • 专门存放你们自己开发的 jar 包 / 模块
  • 分为两个区域:
    • Releases:正式发布版本(类似稳定版)
    • Snapshots:测试版本(每天自动生成的开发中版本)
  • 例:你开发了一个支付 SDK,正式发布到 Releases,测试版放 Snapshots

2. Proxy 仓库(代理仓库)

  • 相当于 "代购机器人"
  • 当你需要下载公共仓库(如 Maven 中央仓库)的 jar 包时
  • 私服会自动通过 Proxy 去中央仓库下载
  • 好处:公司内所有开发者都可以共享缓存,加快下载速度
  • 例:当你在 pom.xml 中引用 spring-boot-starter,私服会通过 Proxy 自动下载

3. Group 仓库(仓库组)

  • 相当于 "仓库集合管理器"
  • 把多个 hosted/proxy 仓库合并成一个逻辑组
  • 当你执行 mvn install 时,会按顺序从组内的仓库查找
  • 常见配置:把公司内部的 hosted 和代理的 central 仓库合并成一个 group
  • 例:配置成 [hosted-releases, hosted-snapshots, proxy-central] 的顺序查找

总结使用场景:

  • 发布自己的代码 → Hosted 仓库
  • 下载外部依赖 → Proxy 仓库
  • 统一配置管理 → Group 仓库
  • 最终开发者只需要连接 Group 仓库即可自动管理所有依赖

⑶如何搭建私服

下载Nexus

官网地址:https://help.sonatype.com/repomanager3/download

安装Nexus

下载后解压到一个没有中文的路径下:

进入到D:\nexus-3.66.0-02\bin目录下:

双击nexus.exe没有反应,需要以管理员身份打开cmd窗口,输入命令: nexus /run 回车,需要等待一段时间,直到出现Started Sonatype Nexus OSS 3.66.0-02说明安装成功。

访问Nexus

访问地址:http://localhost:8081

端口号可以改变,在D:\nexus-3.66.0-02\etc目录下的nexus-default.properties文件中进行修改。

3. Nexus私服的应用

⑴ 登录

密码所在的文件:

点Browse观察

⑵设置仓库

创建仓库

    起名

    创建

    将创建好的仓库添加到public组中。

    ⑶ 使用Nexus下载jar包

    创建一个新的本地仓库,用来接收Nexus下载下来的jar包。

    因为要使用Maven工具访问私服,所以settings.xml文件要修改。

    本地仓库地址修改为新地址

    设置每次访问Nexus的用户名和密码,修改settings.xml文件中的<server>标签

    设置<mirror>标签为Nexus的maven-public库地址(仓库组)

    	<mirror>
      <id>hhh-nexus</id>
      <mirrorOf>central</mirrorOf>
      <name>mynexus</name>
      <url>http://localhost:8081/repository/maven-public/</url>
    </mirror>

    其中<url>标签的地址复制maven-public库的地址。这个地址取代了中央仓库地址。我们所有的jar包下载都是从这个地址里找。它包含宿主库和代理库的所有地址。

    打开Idea2023,确定是新的本地仓库地址

    观察私服Nexus上的maven-public组

    ⑷使用Idea部署jar包到Nexus私服

    私服Nexus是部署在局域网的,是全公司共享的仓库地址,每个团队都可以将已完成的功能或测试版本发布到私服供别人来使用。

    打开要部署的项目的pom.xml文件,设置上传路径

    <distributionManagement>
      <repository>
        <id>hhh-nexus</id>
        <url>http://localhost:8081/repository/hhhh-release/</url>
      </repository>
    
      <snapshotRepository>
        <id>hhh-nexus</id>
        <url>http://localhost:8081/repository/hhh-snapshot/</url>
      </snapshotRepository>
    
    </distributionManagement>

    其中<url>路径来自于私服hhh-snapshot.

    运行deploy部署命令

    观察私服对应仓库变化

    snapshot项目部署

    release项目部署

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328396.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    C语言数字分隔题目

    一、题目引入 编写一个程序,打印出从用户输入的数字开始,递减到1的序列。要求每次打印一行,数字之间用逗号分隔,最后一个数字后面没有逗号。 二、代码展示 三、运行结果 四、思路分析 1.先用一个for循环对输入的数字进行递减 2.再对for循环里面的数字进行筛选 如果大于1 …

    ARM-外部中断,ADC模数转换器

    根据您提供的图片&#xff0c;我们可以看到一个S3C2440微控制器的中断处理流程图。这个流程图展示了从中断请求源到CPU的整个中断处理过程。以下是流程图中各个部分与您提供的寄存器之间的关系&#xff1a; 请求源&#xff08;带sub寄存器&#xff09;&#xff1a; 这些是具体的…

    git克隆数据失败

    场景&#xff1a;当新到一家公司&#xff0c;然后接手了上一个同时的电脑&#xff0c;使用git克隆代码一直提示无法访问&#xff0c;如图 原因&#xff1a;即使配置的新的用户信息。但是window记录了上一个同事的登录信息&#xff0c;上一个同事已经被剔除权限&#xff0c;再拉…

    自动化备份全网服务器数据平台

    自动化备份全网服务器数据平台 项目背景知识 总体需求 某企业里有一台Web服务器&#xff0c;里面的数据很重要&#xff0c;但是如果硬盘坏了数据就会丢失&#xff0c;现在领导要求把数据做备份&#xff0c;这样Web服务器数据丢失在可以进行恢复。要求如下&#xff1a;1.每天0…

    AI Agent系列(八) -基于ReAct架构的前端开发助手(DeepSeek)

    AI Agent系列【八】 项目目标一、核心功能设计二、技术栈选择三、Python实现3.1 设置基础环境3.2 定义AI前端生成的类3.4 实例化3.5 Flask路由3.6 主程序执行 四、 功能测试 项目目标 开发一个能够协助HTMLJSCSS前端设计的AI Agent&#xff0c;通过在网页中输入相应的问题&am…

    一文学会云服务器配置Milvus向量数据库

    服务器准备 首先&#xff0c;我们需要进行服务器的准备&#xff0c;这里准备的是RTX-4090服务器 连接我们已经创建好的服务器&#xff0c;这里可使用MobaXterm进行ssh连接 ssh funhpcIP地址 一键完成Docker配置 注&#xff1a;docker的旧版本不一定被称为docker&#xff0c;doc…

    19685 握手问题

    19685 握手问题 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;2024、省赛、数学 &#x1f4d6; &#x1f4da; package test ;import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);…

    【MySQL数据库】锁机制

    概述 锁&#xff1a;是计算机协调多个进程或者线程并发访问某一资源的机制。在数据库中&#xff0c;除了传统的计算资源&#xff08;CPU、RAM、IO&#xff09;的争用以外。数据也是一种供多用户共享的资源。如何保证数据的并发访问的一致性、有效性是所有数据库必须解决的一个…

    react redux的学习,单个reducer

    redux系列文章目录 一 什么redux&#xff1f; redux是一个专门用于做状态管理的JS库(不是react插件库)。它可以用在react, angular, vue等项目中, 但基本与react配合使用。集中式管理react应用中多个组件共享的状 简单来说&#xff0c;就是存储页面的状态值的一个库&#xf…

    分布式控制技术赋能智慧工厂精准控制研究

    摘要&#xff1a;本文聚焦于分布式控制技术在智慧工厂精准控制中的应用。详细阐述了分布式控制系统&#xff08;DCS&#xff09;、边缘计算机、边边协同技术以及分布式计算等关键要素在实现精准控制中的作用机制。同时&#xff0c;分析了云边协同模式存在占用带宽、单点故障、数…

    清明节里清明菜:软萩(拟人版介绍)

    好像人们无论过任何节&#xff0c;总是离不开吃 清明节里吃清明菜&#xff0c;你采摘了吗&#xff1f; 姓名 软萩&#xff0c;也叫鼠麴草、清明菜、软雀&#xff0c;学名鼠曲草。 一些地方性小名&#xff08;防止大家找不到组织&#xff0c;已知的都附上&#xff09;&#xf…

    JavaWeb学习--MyBatis-Plus整合SpringBoot的ServiceImpl方法(增加,修改与删除部分)

    接下来是常用的增加&#xff0c;修改以及删除部分 首先是增加部分&#xff0c;增加一个新的数据 Testpublic void testInsert() {// 添加一个新用户记录Student s new Student();s.setName("NewStudent");s.setAge(25);boolean saved studentService.save(s);//可以…

    AiCube 试用 - 创建流水灯工程

    AiCube 试用 - 创建流水灯工程 本文介绍了 Aiapp-ISP 仿真调试平台软件的 AiCube 工具&#xff0c;实现流水灯工程的快速创建的主要流程。 下载运行 下载 最新版 AIapp-ISP 软件&#xff1b; 解压并打开该软件&#xff0c;右侧操作界面选择并进入 Keil 仿真设置 标签项&…

    GISBox:核心功能免费的一站式三维GIS处理平台

    大家好&#xff0c;今天为大家介绍的软件是GISBox&#xff1a;一款核心功能免费的一站式三维GIS处理平台&#xff0c;主要是适用于数字孪生。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 软件官网&#xff1a;http://www.gisbox.…

    【论文笔记】DeepSeek-R1 技术报告

    最强开源LLM&#xff0c;性能和效果都很棒&#xff1b;在数学、代码这种有标准正确答案的场景&#xff0c;表现尤为突出&#xff1b;一些其他场景的效果&#xff0c;可能不如DeepSeek-V3和Qwen。 Deepseek-R1没有使用传统的有监督微调sft方法来优化模型&#xff0c;而使用了大规…

    基于javaweb的SSM羽毛球会员俱乐部系统场馆课程运动设计与实现(源码+文档+部署讲解)

    技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

    [dp4_路径问题] 下降路径最小和 | 最小路径和 | 地下城游戏

    目录 1.下降路径最小和 题解 2.最小路径和 题解 3.地下城游戏 题解 做算法题的时候&#xff0c;谨记图画得越详细越好&#xff0c;思路想的越清晰越好&#xff0c;然后再用代码实现一下就好啦 1.下降路径最小和 链接&#xff1a;931. 下降路径最小和 给你一个 n x n 的…

    EasyExcel 数据字典转换器实战:注解驱动设计

    一、场景痛点与解决方案 1. 问题背景 在 Excel 导入导出场景中&#xff0c;开发者常面临以下问题&#xff1a; 数据可读性差&#xff1a;数据库存储的字典值&#xff08;如 1、true&#xff09;直接导出时难以理解双向转换复杂&#xff1a;导入时需将用户输入的标签反向解析…

    解决STM32CubeMX中文注释乱码

    本人采用【修改系统环境变量】的方法 1. 使用快捷键 win X&#xff0c;打开【系统R】&#xff0c;点击【高级系统设置】 2. 点击【环境变量】 3. 点击【新建】 4.按图中输入【JAVA_TOOL_OPTIONS】和【-Dfile.encodingUTF-8】&#xff0c;新建环境变量后重启CubeMX即可。 解释…

    AI产品的上层建筑:提示词工程、RAG与Agent

    上节课我们拆解了 AI 产品的基础设施建设&#xff0c;这节课我们聊聊上层建筑。这部分是产品经理日常工作的重头戏&#xff0c;包含提示词、RAG 和 Agent 构建。 用 AI 客服产品举例&#xff0c;这三者的作用是这样的&#xff1a; 提示词能让客服很有礼貌。比如它会说&#x…