前言

我们知道maven包的版本有两类,一类是 SNAPSHOT,一类是 RELEASE。

这两类有个重要的区别,RELEASE 的包需要改 pom.xml 中的 <version> 的时候才会引入其他版本(如新版本),但是 SNAPSHOT 允许不改 <version> 而引入新版本(自动通过时间戳判断)

那 SNAPSHOT 是怎么做到的呢? SNAPSHOT 就是为了应对 “被依赖者频繁改版本号导致依赖者需要频繁修改pom.xml的版本” 的问题。例如A依赖B,B在开发过程中,所以B肯定是经常变动的,每次变动时都得通知A修改版本,会疯掉的。如果B是SNAPSHOT版本,B更改后,A并不需要修改pom.xml中的版本就可以不断拉取到B的更新。

但是有个问题,B虽然是SNAPSHOT的,但是maven或者说IDE(Eclipse或IDEA)并不是非常频繁去拉取更新,据说 是按天拉取的。比如你项目依赖的这个jar是今天下载的,接着有人推了新版jar到私库,要等到明天才会检查到本地的jar的时间戳落后于私库上的,因此这种按天的触发频率太慢了如何手动触发? 见下文

触发更新SNAPSHOT

如何手工触发拉取最新的SNAPSHOT版本的jar? 方法有:(详细参考后文

  1. 使用 -U 参数。在命令行或 IDEA 里执行 mvn clean compile -U 即可触发重新拉取
  2. 配置IDE,以 IDEA 为例,在设置中勾上 Always update snapshots,在手工点击右侧Maven的刷新按钮即可触发
  3. 改 maven的 settings.xml文件(详细见后)
  4. 手工删除本地仓库的jar包,并点击 IDEA 右侧Maven的刷新按钮触发重新拉取s

详细方法和步骤

1. 使用 -U
  • 使用 mvn clean compile -U 来实现拉取最新的snapshot版本的jar
* 除了用compile,你也可以用其他的,比如 mvn clean package/install/deploy -U
* 最好还是要有 clean,避免不必要的麻烦,不要把clean省略
* 追加其他参数也行,比如
mvn clean compile -U -e
mvn clean compile -U -e -B

-B:使用批处理模式构建项目,能够避免一些需要人工参与交互而造成的挂起状态。
-e:如果构建出现异常,该参数能让maven打印完整的stack trace,进而可以方便定位问题。
  • -U 是强制检查的意思,-U并不是每次都会拉最新的,只有在时间戳落后于私库上的jar的时候才会下载最新
  • 注意一下 -U,检查的是时间戳是否落后,并不是日期是否落后,时间戳是更加精确的。如下 20200821.101436-8 就是时间戳

mvn更新java版本 maven更新jar包_maven

  • 感觉这种方式有个缺点,项目如果编译不过,用这个方式是不是就无法执行这个命令了?
2. 配置IDEA
  • 使用idea的,勾上 “Always update snapshots”

idea 默认是没有勾上的

  • 如下图所示:

mvn更新java版本 maven更新jar包_maven_02

勾上后点击一下 IDEA 中右边的Maven的刷新按钮

mvn更新java版本 maven更新jar包_xml_03

3. 配置 settings.xml

参考 Maven 3.6.0 settings.xml 修改settings.xml,在 repository 和 pluginRepository 下配置总是更新Maven snapshots依赖:

<snapshots>
    <enabled>true</enabled>
    <updatePolicy>always</updatePolicy>
</snapshots>

值说明:

  • enabled: Whether to use this repository for downloading this type of artifact. Default value is: true.
  • updatePolicy: The frequency for downloading updates - can be “always”, “daily” (default), “interval:XXX” (in minutes) or “never” (only if it doesn’t exist locally). Each repository in the project has its own update policy:
  • always - always check when Maven is started for newer versions of snapshots
  • never - never check for newer remote versions. Once off manual updates can be performed.
  • daily (default) - check on the first run of the day (local time)
  • interval:XXX - check every XXX minutes
4. 删除私库中的jar

手工删除本地仓库的jar,点击maven的刷新按钮即可触发重新拉取