diff --git a/lib/modules/manager/maven/extract.spec.ts b/lib/modules/manager/maven/extract.spec.ts index e075d891013d3cc80f4ea12f48d89cd8191c1b49..7ad691c7a9ce0c6e165b5c7a86a8987837c481c8 100644 --- a/lib/modules/manager/maven/extract.spec.ts +++ b/lib/modules/manager/maven/extract.spec.ts @@ -814,6 +814,48 @@ describe('modules/manager/maven/extract', () => { ]); }); + it('should skip root pom.xml when it has an external parent', async () => { + fs.readLocalFile.mockResolvedValueOnce(codeBlock` + <project> + <modelVersion>4.0.0</modelVersion> + <groupId>org.example</groupId> + <artifactId>root</artifactId> + <version>1.0.0</version> + <parent> + <groupId>org.acme</groupId> + <artifactId>external-parent</artifactId> + <version>1.0.0</version> + </parent> + </project> + `); + fs.readLocalFile.mockResolvedValueOnce(codeBlock` + <project> + <parent> + <groupId>org.example</groupId> + <artifactId>root</artifactId> + <version>1.0.0</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <groupId>org.example</groupId> + <artifactId>child</artifactId> + </project> + `); + const res = await extractAllPackageFiles({}, [ + 'pom.xml', + 'foo.bar/pom.xml', + ]); + expect(res).toMatchObject([ + { + packageFile: 'pom.xml', + deps: [{ depName: 'org.acme:external-parent', depType: 'parent' }], + }, + { + packageFile: 'foo.bar/pom.xml', + deps: [{ depName: 'org.example:root', depType: 'parent-root' }], + }, + ]); + }); + it('handles cross-referencing', async () => { fs.readLocalFile.mockResolvedValueOnce(codeBlock` <project> diff --git a/lib/modules/manager/maven/extract.ts b/lib/modules/manager/maven/extract.ts index b80338536c4ef8fb6a9e2b4f981d3e33b34efff6..4b010b8f1a865abef0b56c246b46637f07606f88 100644 --- a/lib/modules/manager/maven/extract.ts +++ b/lib/modules/manager/maven/extract.ts @@ -473,7 +473,10 @@ export function resolveParents(packages: PackageFile[]): PackageFile[] { const dep = applyProps(rawDep, name, extractedProps[name]); if (dep.depType === 'parent') { const parentPkg = extractedPackages[pkg.parent!]; - if (parentPkg && !parentPkg.parent) { + const hasParentWithNoParent = parentPkg && !parentPkg.parent; + const hasParentWithExternalParent = + parentPkg && !packageFileNames.includes(parentPkg.parent!); + if (hasParentWithNoParent || hasParentWithExternalParent) { rootDeps.add(dep.depName!); } }