理解Maven中的SNAPSHOT版本和正式版本

简介: Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制。在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个属性构成的,分别是groupId、artifactId以及version。

Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制。在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个属性构成的,分别是groupId、artifactId以及version。这三个属性可以唯一确定一个组件(Jar包或者War包)。

其实在Nexus仓库中,一个仓库一般分为public(Release)仓和SNAPSHOT仓,前者存放正式版本,后者存放快照版本。如果在项目配置文件中(无论是build.gradle还是pom.xml)指定的版本号带有’-SNAPSHOT’后缀,比如版本号为’Junit-4.10-SNAPSHOT’,那么打出的包就是一个快照版本。

快照版本和正式版本的主要区别在于,本地获取这些依赖的机制有所不同。假设你依赖一个库的正式版本,构建的时候构建工具会先在本次仓库中查找是否已经有了这个依赖库,如果没有的话才会去远程仓库中去拉取。所以假设你发布了Junit-4.10.jar到了远程仓库,有一个项目依赖了这个库,它第一次构建的时候会把该库从远程仓库中下载到本地仓库缓存,以后再次构建都不会去访问远程仓库了。所以如果你修改了代码,向远程仓库中发布了新的软件包,但仍然叫Junit-4.10.jar,那么依赖这个库的项目就无法得到最新更新。你只有在重新发布的时候升级版本,比如叫做Junit-4.11.jar,然后通知依赖该库的项目组也修改依赖版本为Junit-4.11,这样才能使用到你最新添加的功能。

这种方式在团队内部开发的时候会变的特别蛋痛。假设有两个小组负责维护两个组件,example-service和example-ui,其中example-ui项目依赖于example-service。而这两个项目每天都会构建多次,如果每次构建你都要升级example-service的版本,那么你会疯掉。这个时候SNAPSHOT版本就派上用场了。每天日常构建时你可以构建example-service的快照版本,比如example-service-1.0-SNAPSHOT.jar,而example-ui依赖该快照版本。每次example-ui构建时,会优先去远程仓库中查看是否有最新的example-service-1.0-SNAPSHOT.jar,如果有则下载下来使用。即使本地仓库中已经有了example-service-1.0-SNAPSHOT.jar,它也会尝试去远程仓库中查看同名的jar是否是最新的。有的人可能会问,这样不就不能充分利用本地仓库的缓存机制了吗?别着急,Maven比我们想象中的要聪明。在配置Maven的Repository的时候中有个配置项,可以配置对于SNAPSHOT版本向远程仓库中查找的频率。频率共有四种,分别是always、daily、interval、never。当本地仓库中存在需要的依赖项目时,always是每次都去远程仓库查看是否有更新,daily是只在第一次的时候查看是否有更新,当天的其它时候则不会查看;interval允许设置一个分钟为单位的间隔时间,在这个间隔时间内只会去远程仓库中查找一次,never是不会去远程仓库中查找(这种就和正式版本的行为一样了)。

Maven版本的配置方式为:

1
2
3
4
5
6
7
8
<repository>
    <id>myRepository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

其中updatePolicy就是那4种类型之一。如果配置间隔时间更新,可以写作interval:XX(XX是间隔分钟数)。daily配置是默认值。

而在Gradle,可以设置本地缓存的更新策略。

1
2
3
4
5
6
configurations.all {

// check for updates every build
resolutionStrategy.cacheChangingModulesFor  0,'seconds'

}

当然也可以按照分钟或者小时来设置.

1
2
3
4
5
configurations.all {

resolutionStrategy.cacheChangingModulesFor  10, ‘minutes'

}
1
2
3
4
5
configurations.all {

resolutionStrategy.cacheChangingModulesFor  4, ‘hours'

}

所以一般在开发模式下,我们可以频繁的发布SNAPSHOT版本,以便让其它项目能实时的使用到最新的功能做联调;当版本趋于稳定时,再发布一个正式版本,供正式使用。当然在做正式发布时,也要确保当前项目的依赖项中不包含对任何SNAPSHOT版本的依赖,保证正式版本的稳定性。

相关文章
|
4月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
在多团队协作的大型软件开发中,Maven的SNAPSHOT机制解决了频繁版本更新的困扰。当如data-service团队持续迭代时,不必每次通知app-ui团队更新依赖。SNAPSHOT表示开发中的不稳定版本,每次构建时Maven会检查远程仓库获取最新快照,如data-service:1.0-SNAPSHOT,确保团队能自动获取到最新的开发进展。
|
30天前
|
Java API Apache
除了 Maven,还有哪些工具可以管理项目的依赖和版本冲突
除了Maven,常用的项目依赖管理和版本冲突解决工具有Gradle、Ivy、Ant+Ivy、SBT等。这些工具各有特点,适用于不同的开发环境和需求。
|
4月前
|
Java Maven
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
|
5月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
**Maven SNAPSHOT简化多团队协作:**当开发团队频繁更新模块如data-service:1.0-SNAPSHOT时,无需通知其他依赖团队。SNAPSHOT自动跟踪远程仓库的最新版本,app-ui可直接引用,减少手动更新pom.xml的需要。每次data-service构建,Maven检查并获取仓库中带有时间戳的最新快照,促进迭代开发。
|
4月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
**Maven SNAPSHOT简化多团队协作:**当开发中的data-service频繁更新时,使用1.0-SNAPSHOT标识,每次构建Maven自动检查远程仓库的最新快照,避免了手动通知和更新pom.xml的繁琐步骤,促进模块间的无缝集成。
|
4月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
在多模块协作开发中,Maven SNAPSHOT解决频繁版本更新问题。当如data-service团队持续迭代时,不需每次都通知app-ui团队更新依赖。SNAPSHOT是开发中的版本标记,Maven会自动检测远程仓库的新快照,如data-service:1.0-SNAPSHOT,简化了依赖管理。
|
5月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
在多团队协作开发大型软件项目时,Maven快照(SNAPSHOT)解决了频繁更新版本的问题。当data-service团队频繁修复bug或改进并上传新版本到远程仓库时,会导致app-ui团队需不断更新依赖。快照是开发进程的一个临时版本,Maven会自动检查远程仓库的新快照。因此,data-service团队可以发布data-service:1.0-SNAPSHOT,每次覆盖旧快照,无需app-ui团队每次都手动更新pom.xml。
|
4月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
**Maven SNAPSHOT简化多团队协作:**当开发团队频繁更新模块如data-service:1.0-SNAPSHOT时,无需每次通知依赖团队。SNAPSHOT版本自动在远程仓库检查更新,允许多次迭代而不改变版本号,解决了前端app-ui频繁修改pom.xml的问题。
|
5月前
|
Java Maven
Maven 将询问原型的版本
在创建项目时,Maven 提示选择 `maven-archetype-quickstart` 的版本,用户选择了 6,即版本 1.1。接着,Maven 请求输入项目详细信息,包括 `groupId`、`artifactId`、`version` 和 `package`,用户提供了自定义值。确认细节无误后,Maven 开始生成项目结构,成功创建了一个位于 `C:\MVN\health` 的项目,总耗时 4 分钟 12 秒。
|
4月前
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
**Maven SNAPSHOT简化多团队协作:**当开发团队频繁更新模块如data-service:1.0-SNAPSHOT时,无需每次通知依赖团队。SNAPSHOT版本自动检查远程仓库更新,允许app-ui团队无缝集成最新开发成果,减少手动版本管理。