This is an automated email from the ASF dual-hosted git repository.
Cole-Greer pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/3.8-dev by this push:
new 1a55df5163 Add support for building and running with Java 21 and Java
25 (#3488)
1a55df5163 is described below
commit 1a55df51638bece3dd37090dac1e69838a444a46
Author: Oleksandr Porunov <[email protected]>
AuthorDate: Thu Jul 9 05:50:17 2026 +0100
Add support for building and running with Java 21 and Java 25 (#3488)
Update Groovy to 4.0.32 (which bundles a version of ASM that can parse
Java 25 class files) and make the other changes required to build, test,
and run TinkerPop on Java 21 and Java 25:
- pom.xml: bump groovy.version to 4.0.32 and widen the enforcer
requireJavaVersion range to [11,26)
- StringFactory: detect the Java 21+ lambda class name format
($$Lambda/0x...) so a step's toString() renders "lambda" consistently
- LambdaRestrictionStrategy: match "lambda" case-insensitively
- gremlin-groovy and gremlin-archetype-dsl: declare annotationProcessorPaths
explicitly because, as of JDK 23, javac no longer runs annotation
processors that are only discovered on the classpath (GremlinDslProcessor)
- gremlin-groovy: activate the javadoc groovy-stubs sourcepath profile for
all JDK 11 and newer instead of only 11-17
- gremlin-console: apply the neo4j-gremlin --add-opens flags for JDK 17+
- ImportGremlinPluginTest: account for Math.TAU added in Java 19
- build-test.yml: add Java 21 and Java 25 build jobs
- docs: list experimental Java 21/25 support in the reference runtime table,
the developer system-configuration docs, the 3.8.2 upgrade docs, and the
CHANGELOG
Also bump Hadoop to 3.4.3 so hadoop-gremlin builds and runs on Java 25.
Hadoop 3.3.3 fails on Java 25 because UserGroupInformation calls
Subject.getSubject(), which throws UnsupportedOperationException now that
the Security Manager has been removed. Hadoop 3.4.3 migrated to the
replacement APIs (HADOOP-19212):
- pom.xml: hadoop.version 3.3.3 -> 3.4.3; kerby.version 2.0.1 -> 2.0.3 to
match the Kerby version Hadoop 3.4.3 ships; pin wildfly-common (pulled in
transitively by the Kerby test KDC) to satisfy dependency convergence
- gremlin-test: exclude jline from kerb-simplekdc (only used by the unused
kadmin CLI) to avoid a clash with the jline from Hadoop's yarn client
- hadoop-gremlin: bump nimbus-jose-jwt to 9.30.1 to match Kerby 2.0.3
- spark-gremlin: align Netty (via netty-bom) and metrics-core and bump
curator-recipes, since Spark 3.3.2 and Hadoop 3.4.3 ship different
versions of these
- build-test.yml: include hadoop-gremlin in the Java 21 and Java 25 jobs;
only spark-gremlin remains excluded
spark-gremlin stays on Spark 3.3.2 and is built and tested with Java 11 and
17 only. Spark 3.3.x does not run on Java 21 or newer: its off-heap Platform
class reflects on the private DirectByteBuffer(long, int) constructor that
JDK 21 removed, so Platform.<clinit> fails with NoSuchMethodException. Java
21 support arrived in Spark 4.0 (SPARK-43831) and Java 25 support in Spark
4.1; both require Java 17 as a minimum and Scala 2.13, which would drop
Java 11 support for the module.
Assisted-by: claude-opus-4.8
---
.github/workflows/build-test.yml | 33 ++++++++++++++++++
CHANGELOG.asciidoc | 3 ++
.../dev/developer/development-environment.asciidoc | 5 ++-
docs/src/reference/gremlin-variants.asciidoc | 1 +
docs/src/upgrade/release-3.8.2.asciidoc | 26 ++++++++++++++
.../src/main/resources/archetype-resources/pom.xml | 13 +++++++
gremlin-console/src/main/bin/gremlin.sh | 5 +--
.../verification/LambdaRestrictionStrategy.java | 2 +-
.../gremlin/structure/util/StringFactory.java | 3 +-
.../gremlin/jsr223/ImportGremlinPluginTest.java | 11 ++++--
gremlin-groovy/pom.xml | 40 +++++++++++++++++++---
gremlin-test/pom.xml | 8 +++++
hadoop-gremlin/pom.xml | 2 +-
pom.xml | 15 +++++---
spark-gremlin/pom.xml | 21 +++++++++++-
15 files changed, 171 insertions(+), 17 deletions(-)
diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml
index cdc311effe..d0e74c1032 100644
--- a/.github/workflows/build-test.yml
+++ b/.github/workflows/build-test.yml
@@ -37,6 +37,39 @@ jobs:
distribution: 'temurin'
- name: Build with Maven
run: mvn clean install -pl $EXCLUDE_MODULES -Dci --batch-mode
-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
+ java-jdk21:
+ name: mvn clean install - jdk21
+ timeout-minutes: 45
+ needs: smoke
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+ - name: Set up JDK 21
+ uses: actions/setup-java@v5
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ # spark-gremlin is excluded because Spark 3.3.x does not run on Java 21:
its off-heap Platform initializer
+ # reflects on the private DirectByteBuffer(long, int) constructor that
JDK 21 removed. Java 21 support arrived
+ # in Spark 4.0 (SPARK-43831), which requires Java 17+ and Scala 2.13, so
the 3.8 line cannot adopt it.
+ - name: Build with Maven
+ run: mvn clean install -pl $EXCLUDE_MODULES,-:spark-gremlin -Dci
--batch-mode
-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
+ java-jdk25:
+ name: mvn clean install - jdk25
+ timeout-minutes: 45
+ needs: smoke
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7
+ - name: Set up JDK 25
+ uses: actions/setup-java@v5
+ with:
+ java-version: '25'
+ distribution: 'temurin'
+ # spark-gremlin is excluded because no Spark release TinkerPop can adopt
yet supports Java 25 (Spark 4.x, which
+ # adds Java 25 support, requires Java 17+ and Scala 2.13).
hadoop-gremlin runs on Java 25 as of Hadoop 3.4.3.
+ - name: Build with Maven
+ run: mvn clean install -pl $EXCLUDE_MODULES,-:spark-gremlin -Dci
--batch-mode
-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
java-jdk11:
name: mvn clean install - jdk11
timeout-minutes: 45
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 5a06e91af6..340aa2b2b2 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -27,6 +27,9 @@
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
This release also includes changes from prior 3.7.x releases.
+* Enabled building and running with Java 21 and Java 25 (experimental;
`spark-gremlin` excluded, as Spark 3.3.x only runs on Java 8 through 17).
+* Bumped to Groovy 4.0.32 which adds support for parsing Java 25 bytecode.
+* Bumped Hadoop to 3.4.3 (and Kerby to 2.0.3) to enable `hadoop-gremlin` to
build and run on Java 25.
* Add missing `Configuring` interface to `GraphStepPlaceholder` and
`VertexStepPlaceholder`
[[release-3-8-1]]
diff --git a/docs/src/dev/developer/development-environment.asciidoc
b/docs/src/dev/developer/development-environment.asciidoc
index 33fae609df..4d9fbe7c84 100644
--- a/docs/src/dev/developer/development-environment.asciidoc
+++ b/docs/src/dev/developer/development-environment.asciidoc
@@ -29,7 +29,10 @@ image:conspiracy.png[]
== System Configuration
At a minimum, development of TinkerPop requires
link:https://openjdk.java.net/projects/jdk/11/[Java 11]. Since 3.7.0, you can
also build with
-link:https://openjdk.org/projects/jdk/17/[Java 17]. Note, however, that there
are some issues with deep reflection
+link:https://openjdk.org/projects/jdk/17/[Java 17]. Since 3.8.2, there is also
experimental support for building and
+testing with link:https://openjdk.org/projects/jdk/21/[Java 21] and
link:https://openjdk.org/projects/jdk/25/[Java 25],
+covering every module except `spark-gremlin` (the Spark version it uses only
runs on Java 8 through 17).
+Note, however, that there are some issues with deep reflection
so there are `--add-opens` JVM options included in the pom files to enable
this to work. Maven (requiring a minimum of
link:https://maven.apache.org/download.cgi[Maven 3.5.3+]) is used as the
common build system, which even
controls the builds of non-JVM
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-drivers-variants[GLVs]
diff --git a/docs/src/reference/gremlin-variants.asciidoc
b/docs/src/reference/gremlin-variants.asciidoc
index 9830003aa4..9547d87154 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -697,6 +697,7 @@ The following table outlines recommended runtime versions
by the release in whic
|3.6.0 | Java 8, 11
|3.7.0 | Java 8, 11, 17
|3.8.0 | Java 11, 17
+|3.8.2 | Java 11, 17 (experimental support for Java 21 and 25)
|===
[[gremlin-java-connecting]]
diff --git a/docs/src/upgrade/release-3.8.2.asciidoc
b/docs/src/upgrade/release-3.8.2.asciidoc
index fec2661bcd..a3126f2f9d 100644
--- a/docs/src/upgrade/release-3.8.2.asciidoc
+++ b/docs/src/upgrade/release-3.8.2.asciidoc
@@ -22,3 +22,29 @@ under the License.
Please see the
link:https://github.com/apache/tinkerpop/blob/3.8.2/CHANGELOG.asciidoc#release-3-8-2[changelog]
for a
complete list of all the modifications that are part of this release.
+
+=== Upgrading for Users
+
+==== Experimental Support for JDK 21 and JDK 25
+
+TinkerPop can now be built and run with Java 21 and Java 25, in addition to
the existing support for Java 11 and
+Java 17. This support is experimental: every module except `spark-gremlin`
(see below) is built and tested with
+Java 21 and Java 25. Supporting Java 25 required an upgrade of Groovy to
4.0.32, which bundles a version of ASM that
+is able to parse Java 25 bytecode (class file version 69). The build's Java
version enforcement was relaxed
+accordingly to permit Java 11 through Java 25.
+
+As is the case with Java 17, some libraries still rely on deep reflection
(most notably the Kryo serialization library
+that is used with OLAP), so it may be necessary to `--add-opens` or
`--add-exports` certain modules to run on Java 21
+or Java 25. The same set of options documented for JDK 17 applies to the newer
JDKs and is used by TinkerPop's own
+automated tests.
+
+To support Java 25, Hadoop was upgraded from 3.3.3 to 3.4.3, which migrated
off the removed Security Manager APIs (most
+notably `Subject.getSubject()`, which no longer functions on Java 25). As a
result the `hadoop-gremlin` module now
+builds and runs on Java 21 and Java 25 as well.
+
+The `spark-gremlin` module is not supported on Java 21 or Java 25. Spark 3.3.x
only runs on Java 8 through 17 — on
+Java 21 its off-heap memory support fails to initialize because JDK 21 removed
the private `DirectByteBuffer(long, int)`
+constructor that it accesses reflectively. Java 21 support arrived in Spark
4.0 and Java 25 support in Spark 4.1, but
+those releases require Java 17 as a minimum and Scala 2.13, which would drop
Java 11 support for that module.
+`spark-gremlin` therefore continues to target Spark 3.3.x and is built and
tested with Java 11 and Java 17 only; it is
+excluded from the Java 21 and Java 25 builds.
diff --git
a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
index 53078cec4a..9e10263dd8 100644
---
a/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
+++
b/gremlin-archetype/gremlin-archetype-dsl/src/main/resources/archetype-resources/pom.xml
@@ -65,6 +65,19 @@ limitations under the License.
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
+ <!--
+ Explicitly declare the annotation processor path so that
the GremlinDslProcessor runs. As of JDK 23,
+ javac no longer runs annotation processors that are only
discovered on the classpath unless they are
+ requested explicitly, and the processor is required to
generate the DSL classes (e.g.
+ SocialTraversalSource).
+ -->
+ <annotationProcessorPaths>
+ <path>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-annotations</artifactId>
+ <version>${project.version}</version>
+ </path>
+ </annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
diff --git a/gremlin-console/src/main/bin/gremlin.sh
b/gremlin-console/src/main/bin/gremlin.sh
index b4c50f829a..a2c48a075b 100755
--- a/gremlin-console/src/main/bin/gremlin.sh
+++ b/gremlin-console/src/main/bin/gremlin.sh
@@ -108,9 +108,10 @@ if [ -n "$SCRIPT_DEBUG" ]; then
set -x
fi
-# Try to detect JDK version and add specific flag for JDK 17 to allow use of
neo4j-gremlin
+# Try to detect the JDK major version and add specific flags for JDK 17 and
newer to allow use of neo4j-gremlin
JAVA_VERSION=$($JAVA -version 2>&1 | awk -F '"' '/version/ {print $2}')
-if [[ "$JAVA_VERSION" == 17* ]]; then
+JAVA_MAJOR_VERSION=$(echo "$JAVA_VERSION" | awk -F. '{if ($1 == 1) print $2;
else print $1}')
+if [[ "$JAVA_MAJOR_VERSION" -ge 17 ]]; then
JVM_OPTS+=( "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED" )
JVM_OPTS+=(
"--add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED" )
fi
diff --git
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
index d26141e632..5dc0c25f4c 100644
---
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
+++
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
@@ -51,7 +51,7 @@ public final class LambdaRestrictionStrategy extends
AbstractTraversalStrategy<T
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
for (final Step<?, ?> step : traversal.getSteps()) {
- if ((step instanceof LambdaHolder || step instanceof
ComparatorHolder) && step.toString().contains("lambda"))
+ if ((step instanceof LambdaHolder || step instanceof
ComparatorHolder) && step.toString().toLowerCase().contains("lambda"))
throw new VerificationException("The provided traversal
contains a lambda step: " + step, traversal);
}
}
diff --git
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
index 2b8118200f..c8fa2102d5 100644
---
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -242,7 +242,8 @@ public final class StringFactory {
}
private static boolean hasLambda(final String objectString) {
- return objectString.contains("$Lambda$") || // JAVA
(org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraphPlayTest$$Lambda$1/1711574013@61a52fb)
+ return objectString.contains("$Lambda$") || // JAVA <21
(org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraphPlayTest$$Lambda$1/1711574013@61a52fb)
+ objectString.contains("$$Lambda/") || // JAVA 21+
(org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraphPlayTest$$Lambda/0x00007fc001151000@61a52fb)
objectString.contains("$_run_closure") || // GROOVY
(groovysh_evaluate$_run_closure1@db44aa2)
objectString.contains("<lambda>"); // PYTHON (<function
<lambda> at 0x10dfaec80>)
}
diff --git
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
index 78d953167c..6fa21850f8 100644
---
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
+++
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/ImportGremlinPluginTest.java
@@ -147,8 +147,15 @@ public class ImportGremlinPluginTest {
.fieldsImports(Collections.singletonList(Math.class.getCanonicalName() +
"#*")).create();
final DefaultImportCustomizer customizer = (DefaultImportCustomizer)
module.getCustomizers().get()[0];
- assertThat(customizer.getFieldImports(), is(new HashSet<>(
- Arrays.asList(Math.class.getField("PI"),
Math.class.getField("E")))));
+ // Math.TAU was added in Java 19
+ final HashSet<Field> expectedFields = new HashSet<>(Arrays.asList(
+ Math.class.getField("PI"), Math.class.getField("E")));
+ try {
+ expectedFields.add(Math.class.getField("TAU"));
+ } catch (NoSuchFieldException ignored) {
+ // TAU not available in Java < 19
+ }
+ assertThat(customizer.getFieldImports(), is(expectedFields));
}
@Test
diff --git a/gremlin-groovy/pom.xml b/gremlin-groovy/pom.xml
index cfe8d5cbdb..8d71867f80 100644
--- a/gremlin-groovy/pom.xml
+++ b/gremlin-groovy/pom.xml
@@ -153,6 +153,38 @@ limitations under the License.
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
+ <annotationProcessorPaths>
+ <path>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-annotations</artifactId>
+ <version>${project.version}</version>
+ </path>
+ <path>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-core</artifactId>
+ <version>${project.version}</version>
+ </path>
+ <path>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-shaded</artifactId>
+ <version>${project.version}</version>
+ </path>
+ <path>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin-language</artifactId>
+ <version>${project.version}</version>
+ </path>
+ <path>
+ <groupId>com.squareup</groupId>
+ <artifactId>javapoet</artifactId>
+ <version>${javapoet.version}</version>
+ </path>
+ <path>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr4-runtime</artifactId>
+ <version>${antlr4.version}</version>
+ </path>
+ </annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
@@ -160,9 +192,9 @@ limitations under the License.
<profiles>
<profile>
- <id>jdk11</id>
+ <id>jdk11-and-newer</id>
<activation>
- <jdk>[11,18)</jdk>
+ <jdk>[11,)</jdk>
</activation>
<build>
<plugins>
@@ -172,8 +204,8 @@ limitations under the License.
<configuration>
<!--
need to override source path as we don't seem to
get the groovy-stubs automatically. this worked
- under java 8 but errors under java 11 due to
missing files on the path. i guess java 8 was more
- forgiving.
+ under java 8 but errors under java 11 and newer
due to missing files on the path. i guess java 8
+ was more forgiving.
-->
<sourcepath>${pom.basedir}/src/main/java:${project.build.directory}/generated-sources/annotations:${project.build.directory}/generated-sources/groovy-stubs/main</sourcepath>
</configuration>
diff --git a/gremlin-test/pom.xml b/gremlin-test/pom.xml
index b614b7fe1f..e720f5bd2d 100644
--- a/gremlin-test/pom.xml
+++ b/gremlin-test/pom.xml
@@ -88,6 +88,14 @@ limitations under the License.
<groupId>org.apache.kerby</groupId>
<artifactId>kerb-simplekdc</artifactId>
<version>${kerby.version}</version>
+ <exclusions>
+ <!-- only used by the kadmin CLI tool which is not exercised
by the test KDC; excluding it avoids a
+ version clash with the jline brought in by Hadoop's yarn
client -->
+ <exclusion>
+ <groupId>org.jline</groupId>
+ <artifactId>jline</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
</dependencies>
<build>
diff --git a/hadoop-gremlin/pom.xml b/hadoop-gremlin/pom.xml
index 1e4c251e4c..be365ddb56 100644
--- a/hadoop-gremlin/pom.xml
+++ b/hadoop-gremlin/pom.xml
@@ -128,7 +128,7 @@ limitations under the License.
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
- <version>9.8.1</version>
+ <version>9.30.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
diff --git a/pom.xml b/pom.xml
index f21903869d..d8de6d87f1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -162,16 +162,16 @@ limitations under the License.
<commons.text.version>1.15.0</commons.text.version>
<cucumber.version>7.21.1</cucumber.version>
<exp4j.version>0.4.8</exp4j.version>
- <groovy.version>4.0.25</groovy.version>
+ <groovy.version>4.0.32</groovy.version>
<guice.version>4.2.3</guice.version>
- <hadoop.version>3.3.3</hadoop.version>
+ <hadoop.version>3.4.3</hadoop.version>
<hamcrest.version>3.0</hamcrest.version>
<java.tuples.version>1.2</java.tuples.version>
<javadoc-plugin.version>3.3.1</javadoc-plugin.version>
<javapoet.version>1.13.0</javapoet.version>
<jbcrypt.version>0.4</jbcrypt.version>
<junit.version>4.13.1</junit.version>
- <kerby.version>2.0.1</kerby.version>
+ <kerby.version>2.0.3</kerby.version>
<logback.version>1.2.13</logback.version>
<metrics.version>3.0.2</metrics.version>
<mockito.version>5.19.0</mockito.version>
@@ -253,7 +253,7 @@ limitations under the License.
<rules>
<DependencyConvergence/>
<requireJavaVersion>
- <version>[11,18)</version>
+ <version>[11,26)</version>
</requireJavaVersion>
<requireMavenVersion>
<version>[3.5.3,)</version>
@@ -771,6 +771,13 @@ limitations under the License.
<artifactId>caffeine</artifactId>
<version>${caffeine.version}</version>
</dependency>
+ <!-- xnio-api (pulled in transitively by the Kerby test KDC's
kerb-admin) references conflicting
+ wildfly-common versions; pin to the newer one so dependency
convergence is satisfied -->
+ <dependency>
+ <groupId>org.wildfly.common</groupId>
+ <artifactId>wildfly-common</artifactId>
+ <version>1.5.4.Final</version>
+ </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
diff --git a/spark-gremlin/pom.xml b/spark-gremlin/pom.xml
index 27fc6369cf..69d91a22f1 100644
--- a/spark-gremlin/pom.xml
+++ b/spark-gremlin/pom.xml
@@ -25,6 +25,25 @@ limitations under the License.
</parent>
<artifactId>spark-gremlin</artifactId>
<name>Apache TinkerPop :: Spark Gremlin</name>
+ <dependencyManagement>
+ <dependencies>
+ <!-- Spark 3.3.x and Hadoop 3.4.x pull in different 4.1.x Netty
patch releases. Align every Netty
+ artifact to the version TinkerPop standardizes on so that
dependency convergence is satisfied. -->
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-bom</artifactId>
+ <version>${netty.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <!-- Spark requires dropwizard metrics 4.x; Hadoop 3.4.x pulls in
the older 3.2.4 -->
+ <dependency>
+ <groupId>io.dropwizard.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ <version>4.2.7</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
@@ -177,7 +196,7 @@ limitations under the License.
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
- <version>4.2.0</version>
+ <version>5.2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>