Maven 快照(SNAPSHOT)

Maven 快照(SNAPSHOT)完全解析(2025 最新版)

一句话总结
SNAPSHOT = 开发中的“动态版本”,Maven 自动检测更新 → 适合持续集成,不适合生产发布


一、什么是 SNAPSHOT?

概念说明
SNAPSHOT 版本1.0.0-SNAPSHOT → 表示开发中
正式版本1.0.0已发布,不可变
核心区别SNAPSHOT 可更新,正式版 不可变
1.0.0-SNAPSHOT  → 每次构建生成新时间戳
└── 1.0.0-20251102.152345-1.jar

二、SNAPSHOT 工作机制

graph LR
    A[本地仓库] -- 缺失或过期 --> B[远程仓库]
    B -- 检查 metadata --> C[metadata.xml]
    C -- 有更新 --> D[下载最新 SNAPSHOT]
    D -- 无更新 --> E[使用本地缓存]

关键文件:maven-metadata.xml

<metadata>
  <groupId>com.example</groupId>
  <artifactId>my-lib</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <versioning>
    <latest>1.0.0-SNAPSHOT</latest>
    <release>1.0.0</release>
    <versions>
      <version>1.0.0-SNAPSHOT</version>
    </versions>
    <lastUpdated>20251102152345</lastUpdated>
  </versioning>
</metadata>

三、SNAPSHOT 构建流程

# 1. 构建 SNAPSHOT
mvn deploy

# 输出:
# my-lib-1.0.0-20251102.152345-1.jar
# my-lib-1.0.0-20251102.152345-1.pom
# maven-metadata.xml (自动更新)

仓库结构

repository/
└── com/example/my-lib/1.0.0-SNAPSHOT/
    ├── my-lib-1.0.0-20251102.152345-1.jar
    ├── my-lib-1.0.0-20251102.152345-1.pom
    ├── my-lib-1.0.0-20251102.152346-2.jar  ← 第二次构建
    └── maven-metadata.xml

四、SNAPSHOT 更新策略

策略说明配置方式
always每次构建都检查更新-U<updatePolicy>
daily每天检查一次(默认)默认
interval:X每 X 分钟检查<updatePolicy>interval:60</updatePolicy>
never永不检查<updatePolicy>never</updatePolicy>

强制更新(推荐 CI 使用)

mvn clean install -U

五、SNAPSHOT 在 pom.xml 中的使用

1. 依赖 SNAPSHOT

<dependency>
    <groupId>com.example</groupId>
    <artifactId>common-utils</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

2. 发布 SNAPSHOT

<distributionManagement>
  <snapshotRepository>
    <id>nexus-snapshots</id>
    <url>http://nexus:8081/repository/maven-snapshots/</url>
  </snapshotRepository>
</distributionManagement>
mvn deploy  # 自动发布到 snapshots 仓库

六、SNAPSHOT vs 正式版本

特性SNAPSHOT正式版本
版本号x.x.x-SNAPSHOTx.x.x
可更新YesNo
时间戳YesNo
元数据maven-metadata.xml
缓存策略可配置永久缓存
适用场景开发、CI/CD生产发布

七、SNAPSHOT 最佳实践

场景推荐做法
模块间开发使用 1.0.0-SNAPSHOT
CI 构建mvn deploy -U
本地开发mvn install 安装到本地仓库
生产环境禁止使用 SNAPSHOT

禁止 SNAPSHOT 依赖(maven-enforcer-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.5.0</version>
    <executions>
        <execution>
            <goals><goal>enforce</goal></goals>
            <configuration>
                <rules>
                    <banSnapshotDependencies>
                        <message>SNAPSHOT dependencies are not allowed in production!</message>
                    </banSnapshotDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

八、常见问题解决

问题解决方案
SNAPSHOT 不更新mvn clean install -U
metadata.xml 404检查仓库 URL
构建冲突清理本地:rm -rf ~/.m2/repository/com/example/*
CI 缓存问题使用 -U 或设置 always

九、完整示例

pom.xml

<groupId>com.example</groupId>
<artifactId>my-service</artifactId>
<version>1.0.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>common</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
</dependencies>

<distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <url>http://nexus:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

构建命令

# 开发
mvn install

# CI 发布
mvn deploy -U

# 强制更新依赖
mvn clean compile -U

十、一句话总结

“SNAPSHOT = 开发神器,-U = 更新开关,正式版 = 生产铁律”


恭喜!你已掌握 Maven SNAPSHOT!


下一步推荐

方向内容
版本发布流程SNAPSHOT → RELEASE
Nexus 配置分离 snapshots/releases
CI/CD 集成Jenkins + -U

需要 自动发布正式版本脚本
回复 Maven Release 立即获取!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注