28-Linux学习之旅之Maven与Nexus制品库

Linux学习之旅之Maven与Nexus制品库

一、认识Maven

1、Maven是什么

Maven 是 Java 项目的构建工具,负责将源代码编译、测试、打包成可运行的 JAR 或 WAR 包。

2、Maven核心功能

核心功能 说明
依赖管理 统一管理 jar 包:自动下载、引入第三方 jar;解决 jar 包版本冲突;统一管理版本号,不用手动复制 jar 到项目
项目构建 一键完成:编译、测试、打包、安装、部署,一套命令完成整套流程

3、构建流程

bash 复制代码
mvn clean install
    ↓
clean:删除target目录
    ↓
validate 校验项目
    ↓
compile 编译main源码 → target/classes
    ↓
test 编译并执行单元测试(测试失败构建终止)
    ↓
package 打包jar/war → target
    ↓
install 拷贝构件到本地仓库

二、pom.xml 核心配置

pom.xml 是 Maven 项目的工程文件,类似于 C 语言项目中 ./configure 的作用------定义了项目的元信息、依赖关系和构建方式。与 configure 不同的是,pom.xml 中的依赖如果本地没有,Maven 会自动从仓库下载,而 configure

只会检查并报错。

bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--根标签:项目对象模型-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema‑instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven‑4.0.0.xsd">

    <!--模型版本,固定4.0.0-->
    <modelVersion>4.0.0</modelVersion>

    <!-- ========== GAV坐标:唯一标识项目 ========== -->
    <groupId>com.demo</groupId>    <!--公司/组织包名-->
    <artifactId>demo‑project</artifactId> <!--项目/模块名称-->
    <version>1.0‑SNAPSHOT</version> <!--版本号-->

    <!--打包方式:jar / war / pom;默认jar-->
    <packaging>jar</packaging>

    <!--项目名称,可选-->
    <name>demo工程</name>

    <!-- ========== properties:定义全局变量,统一版本 ========== -->
    <properties>
        <java.version>1.8</java.version>
        <spring.version>5.3.20</spring.version>
    </properties>

    <!-- ========== dependencies:依赖,导入第三方jar ========== -->
    <dependencies>
        <dependency>
            <!--依赖的GAV坐标-->
            <groupId>org.springframework</groupId>
            <artifactId>spring‑context</artifactId>
            <version>${spring.version}</version> <!--引用properties变量-->

            <!--依赖范围scope,控制生效周期-->
            <scope>compile</scope>

            <!--排除依赖:解决jar包冲突,排除传递依赖-->
            <exclusions>
                <exclusion>
                    <groupId>xxx</groupId>
                    <artifactId>xxx</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <!-- ========== dependencyManagement:依赖版本管理(父pom用) ========== -->
    <!--只声明版本,不实际引入依赖;子模块直接写gav不用写version-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring‑context</artifactId>
                <version>5.3.20</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- ========== build:构建、插件配置 ========== -->
    <build>
        <plugins>
            <!--插件配置-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven‑compiler‑plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>  <!--编译源码JDK版本-->
                    <target>1.8</target>  <!--生成class字节码版本-->
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- ========== repositories 远程仓库/私服 ========== -->
    <repositories>
        <repository>
            <id>nexus</id>
            <url>http://xxx/nexus/repository/public</url>
        </repository>
    </repositories>

    <!-- ========== 父工程继承 ========== -->
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>demo‑parent</artifactId>
        <version>1.0‑SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <!-- ========== 多模块聚合 ========== -->
    <modules>
        <module>demo‑common</module>
        <module>demo‑service</module>
    </modules>

</project>
标签 作用
project pom 根标签
groupId 组织、公司标识,G 坐标
artifactId 项目 / 模块名称,A 坐标
version 版本号,V 坐标;‑SNAPSHOT快照版本,RELEASE 正式版本
packaging 打包类型 jar/war/pom;pom 用于父工程聚合工程
properties 定义变量,统一管理版本,使用 ${变量名}引用
dependencies 实际引入依赖 jar
dependency 单个依赖,写 GAV
scope 依赖范围:compile、test、provided、runtime
exclusions 排除传递依赖,解决版本冲突
dependencyManagement 版本锁定,不真正引入 jar,多用于父工程统一管理版本
parent 继承父 pom,复用父工程配置、依赖
modules 聚合多模块,一键构建多个子模块
build 构建配置,编译、插件
plugins 插件配置,编译插件、打包插件
repositories 配置远程仓库、私服地址

三、必知的 Maven 命令

bash 复制代码
clean清理 target 目录;compile编译;test单元测试;package打包;install安装本地仓库;deploy部署私服。
mvn dependency:tree用于查看依赖树,解决 jar 包冲突。
-DskipTests可以跳过单元测试。
Maven 命令 作用 说明
mvn clean 清理 删除target目录,清除上次编译打包产物,开发经常先 clean
mvn compile 编译源码 编译 main 下 java 代码,生成 class 到target/classes不执行测试
mvn test 执行单元测试 编译 + 运行 test 目录测试代码;测试失败直接终止构建
mvn package 打包 编译、测试,生成 jar/war 包输出到 target 目录
mvn install 安装到本地仓库 执行打包,把 jar/war 复制到本机本地仓库,本机其他项目可以引用
mvn deploy 部署上传私服 把构件上传到企业私服仓库,需要配置私服,多用于项目发布
mvn clean compile 清理后编译 先删 target,再编译,常用
mvn clean package 清理 + 打包 日常打包最常用,清理旧产物再打包
mvn clean install 清理 + 安装 开发高频命令,清理‑编译‑测试‑打包‑安装本地仓库
mvn clean deploy 清理 + 部署 发布到私服
mvn dependency:tree 打印依赖树 排查 jar 包版本冲突非常重要,查看全部传递依赖
mvn dependency:list 列出所有依赖 列出项目引入全部 jar 包
mvn help:effective‑pom 查看生效 pom 把继承、父 pom 合并,输出完整最终 pom 配置

四、制品与制品库

1、什么是制品和制品库

bash 复制代码
Maven 里制品 = 构件 Artifact:项目构建输出产物,jar、war、pom 文件都属于制品。
制品库:专门存放、管理制品文件的仓库。

五、Nexus基础认知

1、什么是Nexus

Nexus(Sonatype Nexus Repository)是一款开源的仓库管理平台,支持存储和管理多种制品类型(JAR、Docker镜像、npm 包等)。

2、仓库认知

仓库类型 核心作用 是否存储制品 能否 deploy 上传 典型实例
宿主仓库 hosted 存放企业自己开发的私有 jar 包;分为 release 正式版、snapshot 快照版 ✅ 存储 ✅ 可以上传 maven‑releases(正式)、maven‑snapshots(快照)
代理仓库 proxy 代理外网远程仓库;本地没有 jar,就去远程拉取并缓存到私服;不允许上传私有包 ✅只缓存外网下载的包 ❌不可 deploy 上传 maven‑central(代理 Maven 中央仓库)Sonatype
仓库组 group 逻辑聚合器,本身不存任何 jar ,把多个 hosted、proxy 合并,对外暴露一个统一访问地址。查找顺序按照成员列表从上往下查找 ❌不存储 ❌不能 deploy 上传 maven‑public(Nexus 默认仓库组)
中央仓库 Central Maven 官方外网公共仓库,全世界开源 jar 存放地,互联网远程源,不属于私服内部仓库 外网服务器存储 ❌普通用户不能上传 https://repo1.maven.org/maven2/Sonatype

3、仓库之间的工作流程

下载依赖

bash 复制代码
Maven项目请求jar
      ↓
【本地仓库】存在?→有→直接使用结束
      ↓无
访问 Nexus【maven‑public(group仓库组)】
      ↓
先查【hosted宿主仓库(releases/snapshots)】有就返回
      ↓无
交给【proxy代理仓库】
      ↓proxy缓存没有
访问外网【中央仓库】下载jar
      ↓
缓存到proxy仓库 → 返回给Maven,保存到【本地仓库】

上传依赖

bash 复制代码
mvn deploy
      ↓
不能提交给group!
pom指定hosted宿主仓库地址
      ↓
release → maven‑releases(hosted)
snapshot → maven‑snapshots(hosted)
      ↓
制品存入Nexus宿主仓库
      ↓
其他开发者通过 maven‑public(group) 即可下载该jar
相关推荐
kyrie_sakura1 小时前
python学习笔记3 -- 流程控制语句结构
笔记·python·学习
冷凝娇1 小时前
【Pytest】2026 学习总结
学习·pytest
Zhu7582 小时前
在Docker环境离线部署最新版Harbor
运维·docker·容器
跨境小彭2 小时前
Temu半托管运营复盘:批量备货自动化实操解决方案
大数据·运维·自动化·跨境电商·temu
智塑未来2 小时前
大型政企跨区桌面运维困局:综合服务商如何重塑交付格局
运维
hh9503 小时前
Agent Plan x DeepSeek Harness — Token 预算管理与成本追踪体系技术
人工智能·学习·adg·火山引擎·adg成都社区
丰锋ff3 小时前
基于 Qt 的智能门禁系统
qt·学习
小小帅呀3 小时前
学习 VLA 第 2 天:深度学习基础
人工智能·深度学习·学习
敲代码还房贷3 小时前
VMware17 + Ubuntu22.04 共享 完整步骤
linux·python·ubuntu