diff --git a/lib/modules/datasource/maven/__fixtures__/metadata-snapshot-only.xml b/lib/modules/datasource/maven/__fixtures__/metadata-snapshot-only.xml
new file mode 100644
index 0000000000000000000000000000000000000000..28dd5e42726d146ef2dcd702e09f5e44c7316edf
--- /dev/null
+++ b/lib/modules/datasource/maven/__fixtures__/metadata-snapshot-only.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+  <groupId>org.example</groupId>
+  <artifactId>package</artifactId>
+  <versioning>
+    <latest>1.0.3-SNAPSHOT</latest>
+    <release>1.0.3-SNAPSHOT</release>
+    <versions>
+      <version>1.0.3-SNAPSHOT</version>
+    </versions>
+    <lastUpdated>20210101000000</lastUpdated>
+  </versioning>
+</metadata>
diff --git a/lib/modules/datasource/maven/index.spec.ts b/lib/modules/datasource/maven/index.spec.ts
index 578420cee3b818956064bc31993b588aaab8b63b..a20255759fb33fd3724d4863a26b4e6223d08196 100644
--- a/lib/modules/datasource/maven/index.spec.ts
+++ b/lib/modules/datasource/maven/index.spec.ts
@@ -83,9 +83,25 @@ function mockGenericPackage(opts: MockOpts = {}) {
   }
 
   if (pom) {
-    scope
-      .get(`/${packagePath}/${latest}/${artifact}-${latest}.pom`)
-      .reply(200, pom);
+    if (latest.endsWith('-SNAPSHOT')) {
+      const [major, minor, patch] = latest
+        .replace('-SNAPSHOT', '')
+        .split('.')
+        .map((x) => parseInt(x, 10))
+        .map((x) => (x < 10 ? `0${x}` : `${x}`));
+      scope
+        .get(
+          `/${packagePath}/${latest}/${artifact}-${latest.replace(
+            '-SNAPSHOT',
+            ''
+          )}-20200101.${major}${minor}${patch}-${parseInt(patch, 10)}.pom`
+        )
+        .reply(200, pom);
+    } else {
+      scope
+        .get(`/${packagePath}/${latest}/${artifact}-${latest}.pom`)
+        .reply(200, pom);
+    }
   }
 
   if (jars) {
@@ -189,6 +205,43 @@ describe('modules/datasource/maven/index', () => {
     expect(res).toMatchSnapshot();
   });
 
+  it('returns releases when only snapshot', async () => {
+    const meta = loadFixture('metadata-snapshot-version.xml');
+    mockGenericPackage({
+      meta: loadFixture('metadata-snapshot-only.xml'),
+      jars: null,
+      html: null,
+      latest: '1.0.3-SNAPSHOT',
+      snapshots: [
+        {
+          version: '1.0.3-SNAPSHOT',
+          meta: meta,
+          jarStatus: 200,
+        },
+      ],
+    });
+    httpMock
+      .scope(baseUrl)
+      .get('/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml')
+      .reply(200, meta);
+
+    const res = await get();
+
+    expect(res).toEqual({
+      display: 'org.example:package',
+      group: 'org.example',
+      homepage: 'https://package.example.org/about',
+      name: 'package',
+      registryUrl: 'https://repo.maven.apache.org/maven2',
+      releases: [
+        {
+          releaseTimestamp: '2020-01-01T01:00:03.000Z',
+          version: '1.0.3-SNAPSHOT',
+        },
+      ],
+    });
+  });
+
   it('returns html-based releases', async () => {
     process.env.RENOVATE_EXPERIMENTAL_NO_MAVEN_POM_CHECK = 'true';
 
diff --git a/lib/modules/datasource/maven/util.ts b/lib/modules/datasource/maven/util.ts
index 2674ea095533c98286ccf0e2b71f8dd7ef261ae8..1a06e0436ca6d68f3f241eb3f9be51da0fc89ce9 100644
--- a/lib/modules/datasource/maven/util.ts
+++ b/lib/modules/datasource/maven/util.ts
@@ -384,7 +384,12 @@ export async function getDependencyInfo(
   recursionLimit = 5
 ): Promise<Partial<ReleaseResult>> {
   const result: Partial<ReleaseResult> = {};
-  const path = `${version}/${dependency.name}-${version}.pom`;
+  const path = await createUrlForDependencyPom(
+    http,
+    version,
+    dependency,
+    repoUrl
+  );
 
   const pomUrl = getMavenUrl(dependency, repoUrl, path);
   const { xml: pomContent } = await downloadMavenXml(http, pomUrl);