From 2933b01cd55bc73ab99e6e867532093f2d65c94f Mon Sep 17 00:00:00 2001 From: DmitriyLewen <91113035+DmitriyLewen@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:34:59 +0600 Subject: [PATCH] fix(java): correctly inherit properties from parent fields for pom.xml files (#9111) --- pkg/dependency/parser/java/pom/parse_test.go | 39 +++++++++++++------ pkg/dependency/parser/java/pom/pom.go | 10 +++++ .../parent-child-properties/parent/pom.xml | 27 ++++++++----- .../{child => }/pom.xml | 14 +++++-- .../top-parent/pom.xml | 29 -------------- 5 files changed, 67 insertions(+), 52 deletions(-) rename pkg/dependency/parser/java/pom/testdata/parent-child-properties/{child => }/pom.xml (61%) delete mode 100644 pkg/dependency/parser/java/pom/testdata/parent-child-properties/top-parent/pom.xml diff --git a/pkg/dependency/parser/java/pom/parse_test.go b/pkg/dependency/parser/java/pom/parse_test.go index 7587a30fb1..c02cabc3f1 100644 --- a/pkg/dependency/parser/java/pom/parse_test.go +++ b/pkg/dependency/parser/java/pom/parse_test.go @@ -496,31 +496,47 @@ func TestPom_Parse(t *testing.T) { }, }, }, + // [INFO] com.example:child:jar:1.2.3 + // [INFO] +- org.example:example-dependency:jar:1.2.3:compile + // [INFO] | \- org.example:example-api:jar:4.0.0:compile + // [INFO] \- org.example:example-api3:jar:4.0.3:compile { name: "dependencyManagement prefers child properties", - inputFile: filepath.Join("testdata", "parent-child-properties", "child", "pom.xml"), + inputFile: filepath.Join("testdata", "parent-child-properties", "pom.xml"), local: true, want: []ftypes.Package{ { - ID: "com.example:child:1.0.0::b6c336a6", + ID: "com.example:child:1.2.3::14cce9f5", Name: "com.example:child", - Version: "1.0.0", + Version: "1.2.3", Relationship: ftypes.RelationshipRoot, }, { - ID: "org.example:example-dependency:1.2.3::60fa7625", + ID: "org.example:example-api3:4.0.3::c4062c26", + Name: "org.example:example-api3", + Version: "4.0.3", + Relationship: ftypes.RelationshipDirect, + Locations: ftypes.Locations{ + { + StartLine: 30, + EndLine: 34, + }, + }, + }, + { + ID: "org.example:example-dependency:1.2.3::d1f3e5ff", Name: "org.example:example-dependency", Version: "1.2.3", Relationship: ftypes.RelationshipDirect, Locations: ftypes.Locations{ { - StartLine: 22, - EndLine: 26, + StartLine: 25, + EndLine: 29, }, }, }, { - ID: "org.example:example-api:4.0.0::221fee5d", + ID: "org.example:example-api:4.0.0::daf5884b", Name: "org.example:example-api", Version: "4.0.0", Relationship: ftypes.RelationshipIndirect, @@ -528,15 +544,16 @@ func TestPom_Parse(t *testing.T) { }, wantDeps: []ftypes.Dependency{ { - ID: "com.example:child:1.0.0::b6c336a6", + ID: "com.example:child:1.2.3::14cce9f5", DependsOn: []string{ - "org.example:example-dependency:1.2.3::60fa7625", + "org.example:example-api3:4.0.3::c4062c26", + "org.example:example-dependency:1.2.3::d1f3e5ff", }, }, { - ID: "org.example:example-dependency:1.2.3::60fa7625", + ID: "org.example:example-dependency:1.2.3::d1f3e5ff", DependsOn: []string{ - "org.example:example-api:4.0.0::221fee5d", + "org.example:example-api:4.0.0::daf5884b", }, }, }, diff --git a/pkg/dependency/parser/java/pom/pom.go b/pkg/dependency/parser/java/pom/pom.go index 8b8006ca53..0a38be9e59 100644 --- a/pkg/dependency/parser/java/pom/pom.go +++ b/pkg/dependency/parser/java/pom/pom.go @@ -97,6 +97,16 @@ func (p *pom) listProperties(val reflect.Value) map[string]string { m := val.Field(i) for _, e := range m.MapKeys() { v := m.MapIndex(e) + + // element may contain: + // - properties from element of current POM + // - properties from parent POMs (we added these properties early) + // - properties from element of parent POMs + // - properties got from fields of parent POMs (`project.groupId`, `parent.project.version`, etc.) + // Properties from field has higher priority than properties from element. + if tag == "properties" && props[e.String()] != "" { + continue + } props[e.String()] = v.String() } case reflect.Struct: diff --git a/pkg/dependency/parser/java/pom/testdata/parent-child-properties/parent/pom.xml b/pkg/dependency/parser/java/pom/testdata/parent-child-properties/parent/pom.xml index 5ec3c450e1..d80410c349 100644 --- a/pkg/dependency/parser/java/pom/testdata/parent-child-properties/parent/pom.xml +++ b/pkg/dependency/parser/java/pom/testdata/parent-child-properties/parent/pom.xml @@ -2,20 +2,29 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - com.example - top-parent - 1.0.0 - ../top-parent - - - com.example parent - 1.0.0 + 4.0.3 pom parent Parent + + 3.0.0 + 1.2.3 + + + + + + org.example + example-bom + ${bom.version} + pom + import + + + + diff --git a/pkg/dependency/parser/java/pom/testdata/parent-child-properties/child/pom.xml b/pkg/dependency/parser/java/pom/testdata/parent-child-properties/pom.xml similarity index 61% rename from pkg/dependency/parser/java/pom/testdata/parent-child-properties/child/pom.xml rename to pkg/dependency/parser/java/pom/testdata/parent-child-properties/pom.xml index 455ce51acf..92d978a44c 100644 --- a/pkg/dependency/parser/java/pom/testdata/parent-child-properties/child/pom.xml +++ b/pkg/dependency/parser/java/pom/testdata/parent-child-properties/pom.xml @@ -5,24 +5,32 @@ child child + 1.2.3 Child com.example parent - 1.0.0 - ../parent + 4.0.3 + ./parent 4.0.0 + 1.1.1 + 2.3.4 org.example example-dependency - 1.2.3 + ${project.version} + + + org.example + example-api3 + ${project.parent.version} diff --git a/pkg/dependency/parser/java/pom/testdata/parent-child-properties/top-parent/pom.xml b/pkg/dependency/parser/java/pom/testdata/parent-child-properties/top-parent/pom.xml deleted file mode 100644 index e8208fb1bd..0000000000 --- a/pkg/dependency/parser/java/pom/testdata/parent-child-properties/top-parent/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - 4.0.0 - - com.example - top-parent - 1.0.0 - - pom - top-parent - Parent - - - 3.0.0 - - - - - - org.example - example-bom - ${bom.version} - pom - import - - - - -