From f5db1cb56a4d737d5d5045849dbb88a1187e65c2 Mon Sep 17 00:00:00 2001
From: Ben Foster <bpfoster@gmail.com>
Date: Sun, 10 Oct 2021 03:41:51 -0400
Subject: [PATCH] fix(datasource/maven): look for maven snapshot pom (#11327)

---
 .../clojure/__snapshots__/index.spec.ts.snap  | 452 +++++++++++++++
 lib/datasource/clojure/index.spec.ts          |  71 +++
 .../metadata-snapshot-version-invalid.xml     |  12 +
 .../metadata-snapshot-version.xml             |  11 +
 .../maven/__fixtures__/metadata.xml           |   3 +
 .../maven/__snapshots__/index.spec.ts.snap    | 525 ++++++++++++++++++
 lib/datasource/maven/index.spec.ts            |  79 +++
 lib/datasource/maven/index.ts                 | 106 +++-
 8 files changed, 1245 insertions(+), 14 deletions(-)
 create mode 100644 lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml
 create mode 100644 lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml

diff --git a/lib/datasource/clojure/__snapshots__/index.spec.ts.snap b/lib/datasource/clojure/__snapshots__/index.spec.ts.snap
index 1f8904dcf8..aed87d9332 100644
--- a/lib/datasource/clojure/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/clojure/__snapshots__/index.spec.ts.snap
@@ -11,6 +11,24 @@ Array [
     "method": "GET",
     "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -38,6 +56,33 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -47,6 +92,15 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -98,6 +152,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -153,6 +211,24 @@ Array [
     "method": "GET",
     "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -180,6 +256,33 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -189,6 +292,15 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -212,6 +324,24 @@ Array [
     "method": "GET",
     "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -239,6 +369,33 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -248,6 +405,15 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -266,6 +432,24 @@ Array [
     "method": "GET",
     "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -293,6 +477,33 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -302,6 +513,15 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -320,6 +540,10 @@ Array [
     "releaseTimestamp": "2020-01-01T01:00:00.000Z",
     "version": "1.0.0",
   },
+  Object {
+    "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+    "version": "1.0.3-SNAPSHOT",
+  },
   Object {
     "releaseTimestamp": "2020-01-01T02:00:00.000Z",
     "version": "2.0.0",
@@ -338,6 +562,24 @@ Array [
     "method": "GET",
     "url": "http://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "http://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "http://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -365,6 +607,33 @@ Array [
     "method": "HEAD",
     "url": "http://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "http://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "http://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "http://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -374,6 +643,15 @@ Array [
     "method": "HEAD",
     "url": "http://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "http://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -398,6 +676,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -417,6 +699,24 @@ Array [
     "method": "GET",
     "url": "https://custom.registry.renovatebot.com/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -444,6 +744,33 @@ Array [
     "method": "HEAD",
     "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -453,6 +780,15 @@ Array [
     "method": "HEAD",
     "url": "https://custom.registry.renovatebot.com/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -477,6 +813,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -505,6 +845,24 @@ Array [
     "method": "GET",
     "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -532,6 +890,33 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -541,6 +926,15 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -565,6 +959,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -593,6 +991,24 @@ Array [
     "method": "GET",
     "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -620,6 +1036,33 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -629,6 +1072,15 @@ Array [
     "method": "HEAD",
     "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "clojars.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
diff --git a/lib/datasource/clojure/index.spec.ts b/lib/datasource/clojure/index.spec.ts
index 15196c461c..642829eb34 100644
--- a/lib/datasource/clojure/index.spec.ts
+++ b/lib/datasource/clojure/index.spec.ts
@@ -9,6 +9,12 @@ import { ClojureDatasource } from '.';
 const baseUrl = 'https://clojars.org/repo';
 const baseUrlCustom = 'https://custom.registry.renovatebot.com';
 
+interface SnapshotOpts {
+  version: string;
+  jarStatus?: number;
+  meta?: string;
+}
+
 interface MockOpts {
   dep?: string;
   base?: string;
@@ -16,6 +22,7 @@ interface MockOpts {
   pom?: string | null;
   latest?: string;
   jars?: Record<string, number> | null;
+  snapshots?: SnapshotOpts[] | null;
 }
 
 function mockGenericPackage(opts: MockOpts = {}) {
@@ -41,6 +48,29 @@ function mockGenericPackage(opts: MockOpts = {}) {
           '2.0.0': 200,
         }
       : opts.jars;
+  const snapshots =
+    opts.snapshots === undefined
+      ? [
+          {
+            version: '1.0.3-SNAPSHOT',
+            meta: loadFixture(
+              'metadata-snapshot-version.xml',
+              upath.join('..', 'maven')
+            ),
+            jarStatus: 200,
+          },
+          {
+            version: '1.0.4-SNAPSHOT',
+            meta: loadFixture(
+              'metadata-snapshot-version-invalid.xml',
+              upath.join('..', 'maven')
+            ),
+          },
+          {
+            version: '1.0.5-SNAPSHOT',
+          },
+        ]
+      : opts.snapshots;
 
   const scope = httpMock.scope(base);
 
@@ -69,6 +99,45 @@ function mockGenericPackage(opts: MockOpts = {}) {
         .reply(status, '', { 'Last-Modified': timestamp });
     });
   }
+
+  if (snapshots) {
+    snapshots.forEach((snapshot) => {
+      if (snapshot.meta) {
+        scope
+          .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`)
+          .reply(200, snapshot.meta);
+      } else {
+        scope
+          .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`)
+          .reply(404, '');
+      }
+
+      if (snapshot.jarStatus) {
+        const [major, minor, patch] = snapshot.version
+          .replace('-SNAPSHOT', '')
+          .split('.')
+          .map((x) => parseInt(x, 10))
+          .map((x) => (x < 10 ? `0${x}` : `${x}`));
+        const timestamp = `2020-01-01T${major}:${minor}:${patch}.000Z`;
+        scope
+          .head(
+            `/${packagePath}/${
+              snapshot.version
+            }/${artifact}-${snapshot.version.replace(
+              '-SNAPSHOT',
+              ''
+            )}-20200101.${major}${minor}${patch}-${parseInt(patch, 10)}.pom`
+          )
+          .reply(snapshot.jarStatus, '', { 'Last-Modified': timestamp });
+      } else {
+        scope
+          .head(
+            `/${packagePath}/${snapshot.version}/${artifact}-${snapshot.version}.pom`
+          )
+          .reply(404, '');
+      }
+    });
+  }
 }
 function get(
   depName = 'org.example:package',
@@ -109,6 +178,7 @@ describe('datasource/clojure/index', () => {
       meta: loadFixture('metadata-extra.xml', upath.join('..', 'maven')),
       latest: '3.0.0',
       jars: { '3.0.0': 200 },
+      snapshots: [],
     });
 
     const { releases } = await get(
@@ -119,6 +189,7 @@ describe('datasource/clojure/index', () => {
 
     expect(releases).toMatchObject([
       { version: '1.0.0' },
+      { version: '1.0.3-SNAPSHOT' },
       { version: '2.0.0' },
       { version: '3.0.0' },
     ]);
diff --git a/lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml b/lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml
new file mode 100644
index 0000000000..9a0bb8e924
--- /dev/null
+++ b/lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><metadata>
+  <groupId>org.example</groupId>
+  <artifactId>package</artifactId>
+  <version>1.0.4-SNAPSHOT</version>
+  <versioning>
+    <snapshot>
+      <buildNumber>4</buildNumber>
+      <!-- Missing timestamp -->
+    </snapshot>
+    <lastUpdated>20130301200000</lastUpdated>
+  </versioning>
+</metadata>
diff --git a/lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml b/lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml
new file mode 100644
index 0000000000..e91402d64e
--- /dev/null
+++ b/lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><metadata>
+  <groupId>org.example</groupId>
+  <artifactId>package</artifactId>
+  <version>1.0.3-SNAPSHOT</version>
+  <versioning>
+    <snapshot>
+      <timestamp>20200101.010003</timestamp>
+      <buildNumber>3</buildNumber>
+    </snapshot>
+  </versioning>
+</metadata>
\ No newline at end of file
diff --git a/lib/datasource/maven/__fixtures__/metadata.xml b/lib/datasource/maven/__fixtures__/metadata.xml
index a355205eb2..aa8588fb84 100644
--- a/lib/datasource/maven/__fixtures__/metadata.xml
+++ b/lib/datasource/maven/__fixtures__/metadata.xml
@@ -9,6 +9,9 @@
       <version>1.0.0</version>
       <version>1.0.1</version>
       <version>1.0.2</version>
+      <version>1.0.3-SNAPSHOT</version>
+      <version>1.0.4-SNAPSHOT</version>
+      <version>1.0.5-SNAPSHOT</version>
       <version>2.0.0</version>
     </versions>
     <lastUpdated>20210101000000</lastUpdated>
diff --git a/lib/datasource/maven/__snapshots__/index.spec.ts.snap b/lib/datasource/maven/__snapshots__/index.spec.ts.snap
index e3fda6990f..799a466c03 100644
--- a/lib/datasource/maven/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/maven/__snapshots__/index.spec.ts.snap
@@ -11,6 +11,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -38,6 +56,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -47,6 +92,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -101,6 +155,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -156,6 +214,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -183,6 +259,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -192,6 +295,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -575,6 +687,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -602,6 +732,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -611,6 +768,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -629,6 +795,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -656,6 +840,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -665,6 +876,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -683,6 +903,10 @@ Array [
     "releaseTimestamp": "2020-01-01T01:00:00.000Z",
     "version": "1.0.0",
   },
+  Object {
+    "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+    "version": "1.0.3-SNAPSHOT",
+  },
   Object {
     "releaseTimestamp": "2020-01-01T02:00:00.000Z",
     "version": "2.0.0",
@@ -701,6 +925,24 @@ Array [
     "method": "GET",
     "url": "http://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -728,6 +970,33 @@ Array [
     "method": "HEAD",
     "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -737,6 +1006,15 @@ Array [
     "method": "HEAD",
     "url": "http://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -766,6 +1044,15 @@ Object {
     Object {
       "version": "1.0.2",
     },
+    Object {
+      "version": "1.0.3-SNAPSHOT",
+    },
+    Object {
+      "version": "1.0.4-SNAPSHOT",
+    },
+    Object {
+      "version": "1.0.5-SNAPSHOT",
+    },
     Object {
       "version": "2.0.0",
     },
@@ -842,6 +1129,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -861,6 +1152,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -888,6 +1197,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -897,6 +1233,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -921,6 +1266,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -941,6 +1290,26 @@ Array [
     "method": "GET",
     "url": "https://custom.registry.renovatebot.com/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "authorization": "Bearer 123test",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "authorization": "Bearer 123test",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -971,6 +1340,36 @@ Array [
     "method": "HEAD",
     "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "authorization": "Bearer 123test",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "authorization": "Bearer 123test",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "authorization": "Bearer 123test",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -981,6 +1380,16 @@ Array [
     "method": "HEAD",
     "url": "https://custom.registry.renovatebot.com/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "authorization": "Bearer 123test",
+      "host": "custom.registry.renovatebot.com",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -1006,6 +1415,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -1034,6 +1447,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -1061,6 +1492,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -1070,6 +1528,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -1094,6 +1561,10 @@ Object {
       "releaseTimestamp": "2020-01-01T01:00:00.000Z",
       "version": "1.0.0",
     },
+    Object {
+      "releaseTimestamp": "2020-01-01T01:00:03.000Z",
+      "version": "1.0.3-SNAPSHOT",
+    },
     Object {
       "releaseTimestamp": "2020-01-01T02:00:00.000Z",
       "version": "2.0.0",
@@ -1122,6 +1593,24 @@ Array [
     "method": "GET",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -1149,6 +1638,33 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom",
+  },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "GET",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
@@ -1158,6 +1674,15 @@ Array [
     "method": "HEAD",
     "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom",
   },
+  Object {
+    "headers": Object {
+      "accept-encoding": "gzip, deflate, br",
+      "host": "repo.maven.apache.org",
+      "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
+    },
+    "method": "HEAD",
+    "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom",
+  },
   Object {
     "headers": Object {
       "accept-encoding": "gzip, deflate, br",
diff --git a/lib/datasource/maven/index.spec.ts b/lib/datasource/maven/index.spec.ts
index 6a73422dc9..5361a99e62 100644
--- a/lib/datasource/maven/index.spec.ts
+++ b/lib/datasource/maven/index.spec.ts
@@ -9,6 +9,12 @@ import { id as datasource } from '.';
 const baseUrl = 'https://repo.maven.apache.org/maven2';
 const baseUrlCustom = 'https://custom.registry.renovatebot.com';
 
+interface SnapshotOpts {
+  version: string;
+  jarStatus?: number;
+  meta?: string;
+}
+
 interface MockOpts {
   dep?: string;
   base?: string;
@@ -16,6 +22,7 @@ interface MockOpts {
   pom?: string | null;
   latest?: string;
   jars?: Record<string, number> | null;
+  snapshots?: SnapshotOpts[] | null;
 }
 
 function mockGenericPackage(opts: MockOpts = {}) {
@@ -37,6 +44,24 @@ function mockGenericPackage(opts: MockOpts = {}) {
         }
       : opts.jars;
 
+  const snapshots =
+    opts.snapshots === undefined
+      ? [
+          {
+            version: '1.0.3-SNAPSHOT',
+            meta: loadFixture('metadata-snapshot-version.xml'),
+            jarStatus: 200,
+          },
+          {
+            version: '1.0.4-SNAPSHOT',
+            meta: loadFixture('metadata-snapshot-version-invalid.xml'),
+          },
+          {
+            version: '1.0.5-SNAPSHOT',
+          },
+        ]
+      : opts.snapshots;
+
   const scope = httpMock.scope(base);
 
   const [group, artifact] = dep.split(':');
@@ -55,6 +80,7 @@ function mockGenericPackage(opts: MockOpts = {}) {
   if (jars) {
     Object.entries(jars).forEach(([version, status]) => {
       const [major, minor, patch] = version
+        .replace('-SNAPSHOT', '')
         .split('.')
         .map((x) => parseInt(x, 10))
         .map((x) => (x < 10 ? `0${x}` : `${x}`));
@@ -64,6 +90,45 @@ function mockGenericPackage(opts: MockOpts = {}) {
         .reply(status, '', { 'Last-Modified': timestamp });
     });
   }
+
+  if (snapshots) {
+    snapshots.forEach((snapshot) => {
+      if (snapshot.meta) {
+        scope
+          .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`)
+          .reply(200, snapshot.meta);
+      } else {
+        scope
+          .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`)
+          .reply(404, '');
+      }
+
+      if (snapshot.jarStatus) {
+        const [major, minor, patch] = snapshot.version
+          .replace('-SNAPSHOT', '')
+          .split('.')
+          .map((x) => parseInt(x, 10))
+          .map((x) => (x < 10 ? `0${x}` : `${x}`));
+        const timestamp = `2020-01-01T${major}:${minor}:${patch}.000Z`;
+        scope
+          .head(
+            `/${packagePath}/${
+              snapshot.version
+            }/${artifact}-${snapshot.version.replace(
+              '-SNAPSHOT',
+              ''
+            )}-20200101.${major}${minor}${patch}-${parseInt(patch, 10)}.pom`
+          )
+          .reply(snapshot.jarStatus, '', { 'Last-Modified': timestamp });
+      } else {
+        scope
+          .head(
+            `/${packagePath}/${snapshot.version}/${artifact}-${snapshot.version}.pom`
+          )
+          .reply(404, '');
+      }
+    });
+  }
 }
 
 function get(
@@ -126,6 +191,7 @@ describe('datasource/maven/index', () => {
       meta: loadFixture('metadata-extra.xml'),
       latest: '3.0.0',
       jars: { '3.0.0': 200 },
+      snapshots: [],
     });
 
     const { releases } = await get(
@@ -136,6 +202,7 @@ describe('datasource/maven/index', () => {
 
     expect(releases).toMatchObject([
       { version: '1.0.0' },
+      { version: '1.0.3-SNAPSHOT' },
       { version: '2.0.0' },
       { version: '3.0.0' },
     ]);
@@ -313,6 +380,7 @@ describe('datasource/maven/index', () => {
       pom: loadFixture('parent-scm-homepage/pom.xml'),
       latest: '1.0.0',
       jars: null,
+      snapshots: [],
     };
 
     it('should get source and homepage from parent', async () => {
@@ -321,6 +389,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-no-info/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
       mockGenericPackage(parentPackage);
 
@@ -339,6 +408,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-empty/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
 
       const res = await get();
@@ -361,6 +431,7 @@ describe('datasource/maven/index', () => {
         pom: parentPom,
         latest: '2.0.0',
         jars: null,
+        snapshots: [],
       };
 
       const childMeta = loadFixture('child-parent-cycle/child.meta.xml');
@@ -371,12 +442,14 @@ describe('datasource/maven/index', () => {
         pom: childPom,
         latest: '2.0.0',
         jars: null,
+        snapshots: [],
       };
 
       mockGenericPackage({
         ...childPomMock,
         meta: childMeta,
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
       mockGenericPackage(parentPomMock);
       mockGenericPackage(childPomMock);
@@ -398,6 +471,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-scm/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
       mockGenericPackage(parentPackage);
 
@@ -416,6 +490,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-url/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
       mockGenericPackage(parentPackage);
 
@@ -434,6 +509,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-all-info/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
 
       const res = await get();
@@ -451,6 +527,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-scm-gitatcolon/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
 
       const res = await get();
@@ -467,6 +544,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-scm-gitatslash/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
 
       const res = await get();
@@ -482,6 +560,7 @@ describe('datasource/maven/index', () => {
         pom: loadFixture('child-scm-gitprotocol/pom.xml'),
         latest: '2.0.0',
         jars: { '2.0.0': 200 },
+        snapshots: [],
       });
 
       const res = await get();
diff --git a/lib/datasource/maven/index.ts b/lib/datasource/maven/index.ts
index 20e6aef576..e5399bdd14 100644
--- a/lib/datasource/maven/index.ts
+++ b/lib/datasource/maven/index.ts
@@ -1,5 +1,4 @@
-import url from 'url';
-import pAll from 'p-all';
+import pMap from 'p-map';
 import { XmlDocument } from 'xmldoc';
 import { logger } from '../../logger';
 import * as packageCache from '../../util/cache/package';
@@ -95,6 +94,81 @@ function isValidArtifactsInfo(
   return versions.every((v) => info[v] !== undefined);
 }
 
+function isSnapshotVersion(version: string): boolean {
+  if (version.endsWith('-SNAPSHOT')) {
+    return true;
+  }
+  return false;
+}
+
+function extractSnapshotVersion(metadata: XmlDocument): string | null {
+  // Parse the maven-metadata.xml for the snapshot version and determine
+  // the fixed version of the latest deployed snapshot.
+  // The metadata descriptor can be found at
+  // https://maven.apache.org/ref/3.3.3/maven-repository-metadata/repository-metadata.html
+  //
+  // Basically, we need to replace -SNAPSHOT with the artifact timestanp & build number,
+  // so for example 1.0.0-SNAPSHOT will become 1.0.0-<timestamp>-<buildNumber>
+  const version = metadata
+    .descendantWithPath('version')
+    ?.val?.replace('-SNAPSHOT', '');
+
+  const snapshot = metadata.descendantWithPath('versioning.snapshot');
+  const timestamp = snapshot?.childNamed('timestamp')?.val;
+  const build = snapshot?.childNamed('buildNumber')?.val;
+
+  // If we weren't able to parse out the required 3 version elements,
+  // return null because we can't determine the fixed version of the latest snapshot.
+  if (!version || !timestamp || !build) {
+    return null;
+  }
+  return `${version}-${timestamp}-${build}`;
+}
+
+async function getSnapshotFullVersion(
+  version: string,
+  dependency: MavenDependency,
+  repoUrl: string
+): Promise<string | null> {
+  // To determine what actual files are available for the snapshot, first we have to fetch and parse
+  // the metadata located at http://<repo>/<group>/<artifact>/<version-SNAPSHOT>/maven-metadata.xml
+  const metadataUrl = getMavenUrl(
+    dependency,
+    repoUrl,
+    `${version}/maven-metadata.xml`
+  );
+
+  const { xml: mavenMetadata } = await downloadMavenXml(metadataUrl);
+  if (!mavenMetadata) {
+    return null;
+  }
+
+  return extractSnapshotVersion(mavenMetadata);
+}
+
+async function createUrlForDependencyPom(
+  version: string,
+  dependency: MavenDependency,
+  repoUrl: string
+): Promise<string> {
+  if (isSnapshotVersion(version)) {
+    // By default, Maven snapshots are deployed to the repository with fixed file names.
+    // Resolve the full, actual pom file name for the version.
+    const fullVersion = await getSnapshotFullVersion(
+      version,
+      dependency,
+      repoUrl
+    );
+
+    // If we were able to resolve the version, use that, otherwise fall back to using -SNAPSHOT
+    if (fullVersion !== null) {
+      return `${version}/${dependency.name}-${fullVersion}.pom`;
+    }
+  }
+
+  return `${version}/${dependency.name}-${version}.pom`;
+}
+
 async function filterMissingArtifacts(
   dependency: MavenDependency,
   repoUrl: string,
@@ -105,23 +179,26 @@ async function filterMissingArtifacts(
   let artifactsInfo: ArtifactsInfo | null =
     await packageCache.get<ArtifactsInfo>(cacheNamespace, cacheKey);
 
+  // If the cache contains any artifacts that we were previously unable to determine if they exist,
+  // retry the existence checks on them.
   if (!isValidArtifactsInfo(artifactsInfo, versions)) {
-    const queue = versions
-      .map((version): [string, url.URL | null] => {
+    // For each version, determine if there is a POM file available for it
+    const results: ArtifactInfoResult[] = await pMap(
+      versions,
+      async (version): Promise<ArtifactInfoResult | null> => {
+        // Create the URL that the POM file should be available at
         const artifactUrl = getMavenUrl(
           dependency,
           repoUrl,
-          `${version}/${dependency.name}-${version}.pom`
+          await createUrlForDependencyPom(version, dependency, repoUrl)
         );
-        return [version, artifactUrl];
-      })
-      .filter(([_, artifactUrl]) => Boolean(artifactUrl))
-      .map(
-        ([version, artifactUrl]) =>
-          async (): Promise<ArtifactInfoResult> =>
-            [version, await isHttpResourceExists(artifactUrl)]
-      );
-    const results = await pAll(queue, { concurrency: 5 });
+
+        // Return an ArtifactInfoResult that maps the version to the result of the check if the POM file exists in the repo
+        return [version, await isHttpResourceExists(artifactUrl)];
+      },
+      { concurrency: 5 }
+    );
+
     artifactsInfo = results.reduce(
       (acc, [key, value]) => ({
         ...acc,
@@ -138,6 +215,7 @@ async function filterMissingArtifacts(
     await packageCache.set(cacheNamespace, cacheKey, artifactsInfo, cacheTTL);
   }
 
+  // Create releases for every version that exists in the repository
   return versions
     .filter((v) => artifactsInfo[v])
     .map((version) => {
-- 
GitLab