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

[复制链接]
发表于 2025-4-7 19:18:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、 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文件即可

  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>com.bjpowernode</groupId>
  3. <artifactId>maven_parent</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. <!--打包方式必须是pom,声明是父工程-->
  6. <packaging>pom</packaging>
  7. <!--聚合子模块-->
  8. <modules>
  9.   <module>maven_son</module>
  10.   <module>maven_web</module>
  11. </modules>
  12. <properties>
  13.   <!--定义属性,便于版本的管理-->
  14.   <spring-version>5.3.24</spring-version>
  15.   <servlet-version>4.0.1</servlet-version>
  16. </properties>
  17. <!--只是定义,并没有真正的添加依赖,子工程根据需要有选择的添加依赖-->
  18. <dependencyManagement>
  19.   <dependencies>
  20.     <dependency>
  21.       <groupId>org.springframework</groupId>
  22.       <artifactId>spring-context</artifactId>
  23.       <!--引用定义好的属性-->
  24.       <version>${spring-version}</version>
  25.     </dependency>
  26.     <dependency>
  27.       <groupId>javax.servlet</groupId>
  28.       <artifactId>javax.servlet-api</artifactId>
  29.       <version>${servlet-version}</version>
  30.       <scope>provided</scope>
  31.     </dependency>
  32.   </dependencies>
  33. </dependencyManagement>
  34. <build>
  35.   <pluginManagement>
  36.     <plugins>
  37.       <!--只定义Tomcat插件 -->
  38.       <plugin>
  39.         <groupId>org.apache.tomcat.maven</groupId>
  40.         <artifactId>tomcat7-maven-plugin</artifactId>
  41.         <version>2.2</version>
  42.         <configuration>
  43.           <port>8089</port>
  44.           <url>/</url>
  45.         </configuration>
  46.       </plugin>
  47.     </plugins>
  48.   </pluginManagement>
  49. </build>
复制代码
子工程示例:
  1. <modelVersion>4.0.0</modelVersion>
  2. <parent>
  3.   <groupId>com.bjpowernode</groupId>
  4.   <artifactId>maven_parent</artifactId>
  5.   <version>1.0-SNAPSHOT</version>
  6. </parent>
  7. <!--可以省略groupId和version,因为与父工程保持一致-->
  8. <artifactId>maven_web</artifactId>
  9. <packaging>war</packaging>
  10. <!--需要什么依赖,添加什么依赖,可以省略版本号,版本由父工程统一管理 -->
  11. <dependencies>
  12.   <dependency>
  13.   <groupId>org.springframework</groupId>
  14.   <artifactId>spring-context</artifactId>
  15.   </dependency>
  16.   <dependency>
  17.   <groupId>javax.servlet</groupId>
  18.   <artifactId>javax.servlet-api</artifactId>
  19.   </dependency>
  20. </dependencies>
  21. <build>
  22.   <plugins>
  23.     <!--配置Tomcat插件 -->
  24.     <plugin>
  25.       <groupId>org.apache.tomcat.maven</groupId>
  26.       <artifactId>tomcat7-maven-plugin</artifactId>
  27.       <version>2.2</version>
  28.       <!--子工程可以自定义端口号,不自定义使用父工程的-->
  29.       <configuration>
  30.         <port>8060</port>
  31.         <url>/</url>
  32.       </configuration>
  33.     </plugin>
  34.   </plugins>
  35. </build>
复制代码
总结:一句话,通过继承可以实现子工程沿用父工程的设置。大大减少重复设置。
2. 什么是聚合

使用 Maven 聚合功能对项目进行构建时,必要在该项目中额外创建一个的聚合模块,然后通过这个模块构建整个项目标全部模块。聚合模块仅仅是资助聚合其他模块的工具,其本身并无任何实质内容,因此聚合模块中只有一个 POM 文件,不包含 src 等目次。
与父模块相似,聚合模块的打包方式(packaging)也是 pom,用户可以在其 POM 中通过 modules 下的 module 子元素来添加必要聚合的模块的目次路径。父模块的 pom.xml 文件的 <modules> 把子模块聚集起来.
项目布局:

代码示例:
  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>com.bjpowernode</groupId>
  3. <artifactId>maven_ju</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. <packaging>pom</packaging>
  6. <modules>
  7.   <module>../maven_02</module>
  8.   <module>../maven_03</module>
  9.   <module>../maven_01</module>
  10.   <module>../maven_parent</module>
  11. </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包,具体说明如下:
   

  • hosted:宿主堆栈,部署本身的jar包到这个类型的堆栈中,包罗Releases和Snapshots两部分,Releases为公司内部发行版本堆栈,Snapshots为公司内部测试版本堆栈。
  • proxy: 代理堆栈,用于代理远程的公共堆栈,如Maven中央堆栈,用户连接私服,私服自动去中央堆栈下载Jar包大概插件。
  • 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库所在(堆栈组)

  1.         <mirror>
  2.   <id>hhh-nexus</id>
  3.   <mirrorOf>central</mirrorOf>
  4.   <name>mynexus</name>
  5.   <url>http://localhost:8081/repository/maven-public/</url>
  6. </mirror>
复制代码
其中<url>标签的所在复制maven-public库的所在。这个所在取代了中央堆栈所在。我们全部的jar包下载都是从这个所在里找。它包含宿主库和代理库的全部所在。

打开Idea2023,确定是新的本地堆栈所在


观察私服Nexus上的maven-public组

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

私服Nexus是部署在局域网的,是全公司共享的堆栈所在,每个团队都可以将已完成的功能或测试版本发布到私服供别人来使用。
打开要部署的项目标pom.xml文件,设置上传路径
  1. <distributionManagement>
  2.   <repository>
  3.     <id>hhh-nexus</id>
  4.     <url>http://localhost:8081/repository/hhhh-release/</url>
  5.   </repository>
  6.   <snapshotRepository>
  7.     <id>hhh-nexus</id>
  8.     <url>http://localhost:8081/repository/hhh-snapshot/</url>
  9.   </snapshotRepository>
  10. </distributionManagement>
复制代码
其中<url>路径来自于私服hhh-snapshot.


运行deploy部署下令

观察私服对应堆栈厘革
snapshot项目部署

release项目部署







回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表