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