Skip to content

Commit 449650d

Browse files
Fix concurrent modification exception on sorting (#5952)
* Fix concurrent modification exception on sorting ``` Caused by: java.lang.IllegalStateException: Unable to get values of org.jspecify:jspecify:1.0.0 at org.openrewrite.maven.tree.ResolvedPom.getValues(ResolvedPom.java:1227) at org.openrewrite.maven.tree.ResolvedPom.resolveDependencies(ResolvedPom.java:1011) at org.openrewrite.maven.tree.ResolvedPom.resolveDependencies(ResolvedPom.java:984) at org.openrewrite.maven.tree.MavenResolutionResult.resolveDependencies(MavenResolutionResult.java:189) ... 18 common frames omitted Caused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList.sort(ArrayList.java:1723) at org.openrewrite.maven.tree.ResolvedPom.getDependencyManagement(ResolvedPom.java:145) at org.openrewrite.maven.tree.ResolvedPom.getManagedDependency(ResolvedPom.java:379) at org.openrewrite.maven.tree.ResolvedPom.getManagedExclusions(ResolvedPom.java:369) at org.openrewrite.maven.tree.ResolvedPom.getValues(ResolvedPom.java:1204) ... 21 common frames omitted ``` * Avoid `new CopyOnWriteArrayList()` call in constructor This is bad for deserialization. --------- Co-authored-by: Knut Wannheden <knut@moderne.io>
1 parent 80f8652 commit 449650d

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public ResolvedPom(Pom requested, Iterable<String> activeProfiles) {
104104
@Builder.Default
105105
List<ResolvedManagedDependency> dependencyManagement = emptyList();
106106

107+
// TO-BE-REMOVED(2025-11-30): See comment on `getDependencyManagement()`
107108
@NonFinal
108109
@Builder.Default
109110
@Getter(AccessLevel.NONE)
@@ -139,11 +140,16 @@ public ResolvedPom(Pom requested, Iterable<String> activeProfiles) {
139140
List<String> subprojects = emptyList();
140141

141142
// Annotation present to ensure that serialized data is always sorted
143+
// TO-BE-REMOVED(2025-11-30): Remove this method and instead do simpler eager sorting in `resolveParentDependenciesRecursively()`.
144+
// This cannot be changed right now, because in older serialized models the data is unsorted.
142145
@JsonGetter
143146
public List<ResolvedManagedDependency> getDependencyManagement() {
144147
if (!dependencyManagementSorted) {
145-
dependencyManagement.sort(MANAGED_DEPENDENCY_COMPARATOR);
146-
dependencyManagementSorted = true;
148+
// Some use cases require concurrent calls to this method
149+
synchronized (this) {
150+
dependencyManagement.sort(MANAGED_DEPENDENCY_COMPARATOR);
151+
dependencyManagementSorted = true;
152+
}
147153
}
148154
return dependencyManagement;
149155
}

0 commit comments

Comments
 (0)