Update TinkerPop to 3.8.2, drop Java 8 and add Java 17/21/25 support [tp-tests][cql-tests] - #4948
Conversation
05de6df to
24685b4
Compare
7ca4c52 to
e3d3703
Compare
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Pull request overview
Upgrades Apache TinkerPop to 3.8.2 and aligns JanusGraph’s build/test/runtime ecosystem with a Java 11 minimum (plus tests/CI for newer JDKs), including code/test adaptations for TinkerPop 3.8 API/semantic changes and updated transitive dependency versions.
Changes:
- Bump TinkerPop and related dependency versions; switch compilation to
--release 11and introduce JDK17+ test JVM options. - Adapt core code and tests to TinkerPop 3.8 changes (e.g.,
DiscardStep,AggregateStep, GraphSON v1 allow-list,NotPhandling, repeat/barrier semantics). - Update CI workflows, distribution scripts/configs, and documentation for the Java 11+ baseline and new test matrix.
Reviewed changes
Copilot reviewed 69 out of 70 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| pom.xml | Updates core dependency versions, Java compilation to --release 11, and adds JDK17+ test JVM opts/profile. |
| mkdocs.yml | Updates documented TinkerPop version to 3.8.2. |
| janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphStepStrategyTest.java | Adjusts tests for RepeatStep replacement and boxed range API. |
| janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphMultiQueryStrategyTest.java | Updates assertions to expect JanusGraphRepeatStep. |
| janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/AdjacentVertexHasUniquePropertyOptimizerStrategyTest.java | Updates tests from NoneStep to DiscardStep. |
| janusgraph-test/src/test/java/org/janusgraph/graphdb/query/JanusGraphPredicateUtilsTest.java | Adds coverage for NotP-wrapped predicate conversion/support checks. |
| janusgraph-server/src/test/java/org/janusgraph/graphdb/tinkerpop/gremlin/server/handler/SaslAndHMACAuthenticationHandlerTest.java | Updates handler construction to use Settings. |
| janusgraph-server/src/test/java/org/janusgraph/graphdb/tinkerpop/gremlin/server/auth/SaslAndHMACAuthenticatorTest.java | Avoids mocking sealed InetAddress by using loopback. |
| janusgraph-server/src/test/java/org/janusgraph/graphdb/tinkerpop/gremlin/server/auth/HMACAuthenticatorTest.java | Avoids mocking sealed InetAddress by using loopback. |
| janusgraph-scylla/pom.xml | Propagates JDK-dependent test JVM opts into module test opts. |
| janusgraph-examples/README.md | Updates prerequisites to Java 11+. |
| janusgraph-es/pom.xml | Switches test dependency usage away from mockito-inline. |
| janusgraph-driver/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphIoRegistryV1d0.java | Adds GraphSON v1 allowed type-id names constant for embedded types. |
| janusgraph-dist/src/assembly/static/conf/jvm-8.options | Removes Java 8 JVM options file from the distribution. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-hbase.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-hbase-es.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-cql.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-cql-es.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-configuration.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-berkeleyje.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-berkeleyje-es.yaml | Updates GraphSON v1 serializer example with allowedTypeIdNames. |
| janusgraph-dist/src/assembly/static/bin/janusgraph-server.sh | Defaults JVM options to jvm-11.options (no Java 8 branching). |
| janusgraph-dist/pom.xml | Removes Java-11-specific dist profile naming/tagging. |
| janusgraph-dist/docker/Dockerfile | Updates build artifact path naming for new distribution archives. |
| janusgraph-dist/README.md | Removes -Pjava-11 from build instructions. |
| janusgraph-cql/src/test/java/org/janusgraph/testutil/TestLoggerUtils.java | Replaces reflection-based logger swapping with Log4j2 capture appender approach. |
| janusgraph-cql/src/test/java/org/janusgraph/graphdb/cql/CQLGraphTest.java | Reworks flaky parameterized retry tests to non-parameterized retries for JUnit 5.13+. |
| janusgraph-cql/src/test/java/org/janusgraph/graphdb/cql/CQLGraphCacheTest.java | Same rerunner-jupiter workaround expansion as CQLGraphTest. |
| janusgraph-cql/src/test/java/org/janusgraph/diskstorage/cql/CQLStoreTest.java | Removes static-final reflection hacks; uses feature builder + manager spy. |
| janusgraph-cql/src/test/java/org/janusgraph/diskstorage/cql/CQLMultiWriteStoreTest.java | Adapts session leak logging assertions to new log capture mechanism. |
| janusgraph-cql/pom.xml | Propagates JDK-dependent test JVM opts into module test opts. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/strategy/JanusGraphMultiQueryStrategy.java | Introduces RepeatStep replacement for limited-batch semantics under TinkerPop 3.8. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/strategy/AdjacentVertexHasUniquePropertyOptimizerStrategy.java | Updates NoneStep usage to DiscardStep. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/JanusGraphStep.java | Updates HasContainerHolder implementation to new generic signature. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/JanusGraphRepeatStep.java | Adds custom RepeatStep to ignore JanusGraph-inserted barriers for global-repeat switching. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/JanusGraphPropertyMapStep.java | Adapts to PropertyMapStep API change (single valueTraversal). |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/HasStepFolder.java | Updates HasContainerHolder typing/casts for generic signature. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphTraversalUtil.java | Replaces Aggregate* steps with unified AggregateStep. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphFeatures.java | Binds schema-dependent features to calling transaction where possible. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphBlueprintsTransaction.java | Returns transaction-bound features view. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphBlueprintsGraph.java | Adds GraphSON v1 allowed-type-id names automatically for embedded types. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/query/JanusGraphPredicateUtils.java | Unwraps NotP for negated predicate pushdown. |
| janusgraph-core/src/main/java/org/janusgraph/graphdb/predicate/ConnectiveJanusGraphP.java | Updates P.originalValue usage to getValue(). |
| janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphTest.java | Updates multi-query repeat batching assertions and discard() usage. |
| janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIoTest.java | Adds allowed GraphSON v1 embedded type ids to mapper used in tests. |
| janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIndexTest.java | Adjusts sum() assertions to account for TinkerPop 3.8 numeric retention. |
| docs/getting-started/installation.md | Updates runtime requirements to Java 11+ and documents tested JDKs. |
| docs/changelog.md | Updates compatibility matrix and adds detailed upgrade notes for Java 11+ and TinkerPop 3.8. |
| BUILDING.md | Updates build prerequisites to Java 11+. |
| .github/workflows/ci-release.yml | Drops Java 8 lanes; runs build/tests on supported JDKs. |
| .github/workflows/ci-release-dummy.yml | Mirrors CI lane changes (no Java 8 / no -Pjava-11). |
| .github/workflows/ci-publish-official.yml | Updates publish job Java version to 11. |
| .github/workflows/ci-publish-commit.yml | Updates publish job Java version to 11. |
| .github/workflows/ci-index-solr.yml | Moves index suite baseline to Java 11 and adds Java 25 lane. |
| .github/workflows/ci-index-solr-dummy.yml | Mirrors Solr index CI lane changes. |
| .github/workflows/ci-index-es.yml | Moves index suite baseline to Java 11 and adds Java 25 lanes. |
| .github/workflows/ci-index-es-dummy.yml | Mirrors ES index CI lane changes. |
| .github/workflows/ci-docs.yml | Moves docs build baseline to Java 11 and removes -Pjava-11. |
| .github/workflows/ci-core.yml | Drops Java 8 lanes and expands core test matrix to 11/17/21/25. |
| .github/workflows/ci-core-dummy.yml | Mirrors core CI lane changes. |
| .github/workflows/ci-cdc.yml | Shifts CDC baseline to 11/25 and e2e lanes to 17/21. |
| .github/workflows/ci-cdc-dummy.yml | Mirrors CDC CI lane changes. |
| .github/workflows/ci-benchmark.yml | Moves benchmark workflow baseline to Java 11. |
| .github/workflows/ci-backend-scylla.yml | Drops Java 8 lanes; adds Java 25 (and Java 17 for Hadoop lanes). |
| .github/workflows/ci-backend-scylla-dummy.yml | Mirrors Scylla backend CI lane changes. |
| .github/workflows/ci-backend-hbase.yml | Drops Java 8 lanes; adds Java 25 (and Java 17 for Hadoop lanes). |
| .github/workflows/ci-backend-hbase-dummy.yml | Mirrors HBase backend CI lane changes. |
| .github/workflows/ci-backend-cql.yml | Drops Java 8 lanes; adds Java 25 (and Java 17 for Hadoop lanes). |
| .github/workflows/ci-backend-cql-dummy.yml | Mirrors CQL backend CI lane changes. |
Suppressed comments (3)
pom.xml:1
- This execution overrides the default Surefire configuration, but the new
argLineonly includes${test.jdk.jvm.opts}. That likely drops the rest of the repo’s standard test JVM flags (heap sizing,-ea, javaagent/JaCoCo instrumentation, etc.), which can change test behavior and coverage output. Consider composingargLineto include the existing/default test argLine plus${test.jdk.jvm.opts}(rather than replacing it), so this execution stays consistent with the normal test JVM setup.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/strategy/JanusGraphMultiQueryStrategy.java:1 TraversalHelper.getStepsOfClass(RepeatStep.class, traversal)only findsRepeatSteps at the current traversal level (non-recursive). Since multi-query barriers can be inserted into repeat traversals that are nested under other steps, leaving nestedRepeatSteps unwrapped can still trigger TinkerPop’s global repeat/barrier behavior and negate limited-batch semantics. Use the recursive step lookup (as done inJanusGraphStepStrategyTest) and pass the actual owning traversal (e.g.,repeatStep.getTraversal()) to ensure all repeat steps in the traversal tree are replaced correctly.
docs/changelog.md:1- This change appears under the JanusGraph 1.1.0 section (and similarly later for 1.0.1), but it updates the listed TinkerPop/Java versions to 3.8.2 and Java 11/17/21/25. Those versions are not historically accurate for already-released 1.1.0/1.0.1 and will mislead readers. Recommendation: limit these version updates to the 1.2.0 section and the compatibility matrix row for 1.2.z, and keep older release sections unchanged (or explicitly annotate them if the intent is different).
# Changelog
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
e3d3703 to
eef88ff
Compare
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Pull request overview
Copilot reviewed 69 out of 70 changed files in this pull request and generated no new comments.
Suppressed comments (5)
mkdocs.yml:1
hadoop_versioninmkdocs.ymlremains3.3.6while this PR upgrades/manages Hadoop to3.4.3inpom.xml. Update the docs metadata to reflect the new Hadoop version (or clarify why the docs still reference 3.3.6) to avoid confusing readers.
janusgraph-driver/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphIoRegistryV1d0.java:1- This is a public allow-list used for deserialization control, but it’s exposed as a mutable array. Any caller can modify its contents at runtime, potentially widening the GraphSON type allow-list unexpectedly. Prefer an immutable type (e.g.,
List<String>) or keep the array private and expose a defensive copy.
janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphStepStrategyTest.java:1 getStepsOfAssignableClassRecursively(RepeatStep.class, ...)will also return subclasses (includingJanusGraphRepeatStep). Unlike the production strategy (which filters onrepeatStep.getClass() == RepeatStep.class), this helper will re-wrap already replaced steps, making the helper diverge from real behavior and potentially masking regressions. Consider filtering to only replace exactRepeatStepinstances (or explicitly skippingJanusGraphRepeatStep).
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphFeatures.java:1forTransaction(..)allocates a newJanusGraphFeaturesinstance each time it’s called. SinceJanusGraphBlueprintsTransaction.features()may be invoked frequently by TinkerPop during mutations, consider caching the transaction-boundFeaturesview per transaction to reduce allocations (optional optimization).
janusgraph-cql/src/test/java/org/janusgraph/testutil/TestLoggerUtils.java:1LogManager.getContext(false)returns the Log4j SPILoggerContext, which is not guaranteed to beorg.apache.logging.log4j.core.LoggerContextin all setups (e.g., when using alternative context factories/bridges). To make this test utility more robust, avoid an unconditional cast (e.g., verify the type and fail with a clear message or skip capture if Log4j-core isn’t active).
eef88ff to
e21602a
Compare
There was a problem hiding this comment.
🟡 Changes recommended
The release TinkerPop matrix declares Java 17/21/25 lanes but installs Java 11 for every lane.
Get a fresh assessment by requesting another Copilot review.
Review details
- Files reviewed: 69/70 changed files
- Comments generated: 1
- Review effort level: Balanced
e21602a to
217b02a
Compare
TinkerPop 3.8 requires Java 11, so JanusGraph now compiles for (with `--release 11`) and requires Java 11 (closes JanusGraph#3547). The `java-11` Maven profile, the `janusgraph-java-11-*` distribution flavour, the `-java-11` Docker tag suffix and `conf/jvm-8.options` are removed. janusgraph-driver moves to Java 11 too since its TinkerPop dependencies are Java 11 bytecode. JanusGraph is now built and tested on Java 11, 17, 21 and 25: the core suites run on all four in CI, the Docker-backed backend/index suites on 11 and 25, CDC end-to-end on 17/21, while OLAP lanes stay on 11/17 because Spark 3.3.x does not run on Java 21+. A `jdk17-plus-tests` profile passes TinkerPop's JDK 17 `--add-opens` set to the test JVMs, JaCoCo is bumped to 0.8.15 for Java 25 class files, two server tests stop mocking the (since JDK 25 sealed) java.net.InetAddress, and hadoop-client-api/runtime are managed to 3.4.3 so the HBase client no longer hits the removed Subject.getSubject() on Java 24+. Two CQL tests no longer rewrite static final fields through the JDK 12+ incompatible Field "modifiers" hack (features spy / Log4j 2 log capture instead). Dependencies aligned with TinkerPop 3.8.2 (enforcer requireUpperBoundDeps): netty 4.1.138.Final, commons-configuration2 2.15.1, commons-lang3 3.20.0, commons-text 1.15.0, commons-beanutils 1.11.0, commons-logging 1.4.0, hadoop 3.4.3 (avro 1.11.4, jetty 9.4.57.v20241219), mockito 5.23.0 (mockito-inline dropped, inline mock maker is the default), byte-buddy 1.17.7, junit 5.14.4 / junit-platform 1.14.4. JUnit 5.13 breaks rerunner-jupiter's @ParameterizedRepeatedIfExceptionsTest, so the four CQL simpleLogTest retries are expanded into per-parameter @RepeatedIfExceptionsTest methods. Code adapted to the TinkerPop 3.8 API: NoneStep -> DiscardStep, AggregateGlobalStep/AggregateLocalStep -> AggregateStep, P.originalValue -> P.getValue(), generic HasContainerHolder<S, E>, PropertyMapStep's single value traversal instead of a TraversalRing, boxed RangeGlobalStep bounds, `__.none()` -> `__.discard()` in tests, and NotP unwrapping in JanusGraphPredicateUtils so `P.not()`/`negate()` predicates keep being pushed down to the backend. GraphSON 1.0 embedded types only deserialize explicitly allowed `@class` type ids since 3.8.2 (TINKERPOP-3279), so JanusGraph.io() now registers RelationIdentifier, Geoshape and JanusGraphP as allowed type ids for GraphSON 1.0 mappers (JanusGraphIoRegistryV1d0.GRAPHSON_ALLOWED_TYPE_ID_NAMES) and the sample GraphSONMessageSerializerV1 configs carry the matching `allowedTypeIdNames`. Docs: changelog (Java 11 requirement, TinkerPop 3.8 breaking changes, compatibility matrix), installation/BUILDING/examples Java version, mkdocs tinkerpop_version. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Oleksandr Porunov <alexandr.porunov@gmail.com>
217b02a to
9c0a8cb
Compare
Updates Apache TinkerPop from 3.7.3 to 3.8.2 and aligns the transitive dependencies that TinkerPop 3.8.2 raised.
TinkerPop 3.8 requires Java 11 (TINKERPOP-3172; the 3.8.x parent POM enforces
[11,26)and compiles with--release 11), so this upgrade also drops Java 8 support in JanusGraph and makes Java 11 the minimum. Closes #3547.TinkerPop upgrade
tinkerpop.version3.7.3 → 3.8.2,mkdocs.ymltinkerpop_versionupdated.NoneStep→DiscardStep(none()is now thenone(P)collection filter),AggregateGlobalStep/AggregateLocalStep→AggregateStep,P.originalValueremoved (getValue()),HasContainerHolderis now generic (HasContainerHolder<S, E> extends GValueHolder<S, E>),PropertyMapStepcarries a singlevalueTraversalinstead of aTraversalRing,RangeGlobalStep#getLowRange()/getHighRange()return boxedLong,__.none()→__.discard()in the shared test suite.P.not(p)/p.negate()now produce aNotPwrapper instead of the complementary bi-predicate.JanusGraphPredicateUtilsunwrapsNotP.NotPBiPredicateand negates the JanusGraph predicate, so negated predicates keep being folded intoJanusGraphStep/ index queries (newJanusGraphPredicateUtilsTest).@classtype ids since 3.8.2 (TINKERPOP-3279); without an allow-list the TinkerPopIoVertexTest[graphson-v1-embedded]cases fail onRelationIdentifieredge ids.JanusGraph.io()now allowsJanusGraphIoRegistryV1d0.GRAPHSON_ALLOWED_TYPE_ID_NAMES(RelationIdentifier,Geoshape,JanusGraphP; an unmodifiable list, withJanusGraphIoRegistryV1d0.allowGraphSONTypeIds(builder)as the helper for hand-built mappers) on GraphSON 1.0 mappers, the sharedJanusGraphIoTestdoes the same, and the commentedGraphSONMessageSerializerV1examples inconf/gremlin-server/*.yamlcarry the matchingallowedTypeIdNames.AddPropertyStepalways resolves the cardinality ofproperty(key, value)throughGraph.Features.VertexFeatures.getCardinality(key)(3.7 only did so for meta-properties). JanusGraph's implementation looked the key up in a fresh read-only transaction, so a key auto-created in the still-open calling transaction resolved tosingleandg.V(v).property("k", v)wiped LIST/SET values (testAutoSchemaMakerAllowsToSetCardinality*failed).JanusGraphFeaturesis now bound to the calling transaction (JanusGraphBlueprintsTransaction.features()), which also avoids opening a transaction perproperty()call.RepeatStepadds all start traversers to the repeat traversal at once whenever the repeat traversal contains aBarrier(TINKERPOP-3200). JanusGraph's limited-batch multi-query insertsJanusGraphNoOpBarrierVertexOnlySteps into repeat traversals, which would switch everyrepeat()into that mode (all starts held in memory,barrier(n).repeat(...)no longer bounding batches: thehas()-in-repeatprefetch became a single query for all 100 vertices instead of 27-vertex batches). TinkerPop 3.8.2 un-finalizedRepeatStepfor providers, soJanusGraphMultiQueryStrategynow replacesRepeatStepwithJanusGraphRepeatStep, which ignores JanusGraph's own barriers when choosing between TinkerPop's per-start and global algorithms and otherwise behaves exactly likeRepeatStep. The threetestLimitBatchSizeForMultiQueryRepeatStepcases with a userbarrier()insiderepeat()that used to be "batched per iteration" are now batched per loop under TinkerPop's global semantics; their assertions were updated accordingly.@Graph.OptOutentries onJanusGraphwere verified against the gremlin-test 3.8.2 sources (the suite fails hard on entries naming removed tests); all still resolve.Dependencies aligned with TinkerPop 3.8.2 (enforcer
requireUpperBoundDeps)mockito-inlinedropped — the inline mock maker is the default in Mockito 5)JUnit 5.13 removed the old
ArgumentsProvider.provideArguments(ExtensionContext)path, which breaksrerunner-jupiter's@ParameterizedRepeatedIfExceptionsTest(last released in 2020): the foursimpleLogTest*(boolean)retries inCQLGraphTest/CQLGraphCacheTestfailed in CI with "Please implement provideArguments(ParameterDeclarations, ExtensionContext) instead". Those tests are now expanded into one@RepeatedIfExceptionsTestper parameter value (...WithLongId/...WithStringId); the non-parameterized rerunner annotation used by the other 29 tests is unaffected.gremlin-server3.8.2 adds one new compile-scope dependency,io.github.hakky54:ayza-for-netty(Apache-2.0), which therefore ends up injanusgraph-server/ the distribution.Java 11 minimum, Java 17 / 21 / 25 supported
--release 11(compiler.release) instead ofsource/target1.8, so builds on newer JDKs cannot pick up post-11 APIs. Thejava-11Maven profile (root andjanusgraph-dist) is removed since it is now the default; with it go thejanusgraph-java-11-*distribution archives and the-java-11Docker tag suffix.janusgraph-drivermoves to Java 11 as well: its TinkerPop dependencies (gremlin-driver,gremlin-core,gremlin-groovy3.8.2) are compiled for Java 11 (class-file major version 55), so a Java 8 target for the driver could not run on Java 8 anyway.jdk17-plus-testsprofile (auto-activated on JDK 17+) passes TinkerPop's JDK 17--add-opens/--add-exportsset to the test JVMs (also wired into the CQL/Scylla moduletest.jvm.opts). JaCoCo 0.8.12 → 0.8.15 for Java 25 class files.java.net.InetAddressis sealed since JDK 25 and can no longer be mocked (two server tests now useInetAddress.getLoopbackAddress()).Field.class.getDeclaredField("modifiers")hack to rewritestatic finalfields, which JDK 12+ rejects (NoSuchFieldException: modifiers, visible in thecassandra5-*-diskstorage-java25lanes):CQLStoreTest.testGetKeysWithout{Ordered,Unordered}Scannow build the modifiedStandardStoreFeaturesvia the builder's copy constructor and open a dedicated store from a Mockito spy of the manager that reports them, andTestLoggerUtils(used byCQLMultiWriteStoreTest's session-leak tests) now captures the driver's log events through Log4j 2 (the CQL test classpath binds SLF4J tolog4j-slf4j-impl): it temporarily adds aLoggerConfigwith an in-memory appender for the class under test instead of swapping the driver'sprivate static finallogger field.hbase-shaded-clientresolves the current user through Hadoop'sUserGroupInformation, and withjanusgraph-hadoopon the classpath that class came from Spark's transitivehadoop-client-api 3.3.2, which still callsSubject.getSubject()and therefore throwsUnsupportedOperationException: getSubject is not supportedon JDK 24+.hadoop-client-api/hadoop-client-runtimeare now managed to${hadoop.version}(3.4.3, which dropped that call, like the rest of the Hadoop artifacts), verified with a small probe (HBaseConfiguration.create(),UserGroupInformation.getCurrentUser(),User.getCurrent()) on JDK 17, 21 and 25 against the module's runtime classpath.core,driver,server,test,inmemoryincl. TinkerPop suites,berkeleyje,lucene) run on Java 11, 17, 21 and 25; the Docker-backed backend/index suites (CQL on Cassandra 5, Scylla, HBase, Elasticsearch, Solr) run on Java 11 and 25; CDC runs unit tests on 11/25 and the Debezium end-to-end pipeline on 17/21; the TinkerPop suites ofci-releaserun on 11/17/21/25 for inmemory/berkeleyje and additionally on 25 for CQL. OLAP lanes (**/hadoop/*) run on Java 11 and 17 only because Spark 3.3.x does not run on Java 21+ (see TinkerPop'sspark-gremlinnote);build-all, publish, release/dist, docs and benchmark jobs stay on Java 11 (thejanusgraph-fulldistribution embeds Cassandra 4.0.6, which only runs on Java 8/11). Every Java 8 lane is removed and-Pjava-11is stripped (the*-dummyworkflows mirror the lane sets).conf/jvm-8.optionsremoved,bin/janusgraph-server.shalways readsconf/jvm-11.optionsunlessJAVA_OPTIONS_FILEis set; Dockerfile defaultBUILD_PATHfollows the new archive name.Follow-ups that are now unblocked but intentionally left out of this PR: bundling Cassandra 5.0 in the distribution, Caffeine 3 / checkstyle 10 / audience-annotations 0.15 (listed in #3547), and adding Java 17/21 CI lanes.
Verification (local, Java 11.0.31, Maven 3.9.16)
mvn -B -fae validate(enforcerrequireUpperBoundDeps+DependencyConvergenceover all 32 modules): passes.mvn -B install -DskipTests(main + test sources of all 32 modules, checkstyle on): passes.mvn verify --projects janusgraph-inmemory -Dtest.skip.tp=false -DskipTests=true(InMemoryJanusGraphProcessTest,InMemoryMultiQueryJanusGraphProcessTest,InMemoryJanusGraphComputerTest,InMemoryJanusGraphStructureTest): 3431 tests, 0 failures, 0 errors, 294 skipped.mvn verify --projects <module>): janusgraph-driver 127 tests, janusgraph-server 175 tests, janusgraph-core 82, janusgraph-test 998, janusgraph-inmemory 572, janusgraph-berkeleyje 331, janusgraph-lucene 355, janusgraph-mixed-index-utils 16, janusgraph-cdc 49–51, the Mockito-based janusgraph-es unit tests 39 — all green.clean installwith each JDK's javac +--release 11, then the suites above plus the TinkerPop process/structure suites, 2741 tests per JDK;-Pcoveragewith JaCoCo 0.8.15 on core) — all green.CQLKeyColumnValueStoreTestplus the rewrittensimpleLogTest*retries ofCQLGraphTest/CQLGraphCacheTest), Elasticsearch 9 (ElasticsearchIndexTest, 266 tests), Solr 8 (SolrIndexWithoutKerberosTest, 256 tests) — green. The HBase Docker image cannot be built on this machine (itsapt-getstep fails locally), so HBase on 25 was verified with theUserGroupInformation/User.getCurrent()probe described above and is otherwise left to the newhbase2-*-java25CI lanes.janusgraph-hadoop, Spark 3.3.2 with the aligned Hadoop 3.4.3 client artifacts) passes on Java 11 and 17.RepeatStepreplacement with an exact-class filter (strategy and test helper), per-transaction caching of the features view, immutable GraphSON allow-list plus helper, type-checked Log4j context in the CQL log-capture helper,mkdocs.ymlhadoop_version3.3.6 → 3.4.3 (it only feeds the Hadoop docs link), and theci-releasetp-testsjob now installs${{ matrix.java }}instead of the hard-coded Zulu11.0.20+1, so its Java 17/21/25 TinkerPop lanes really run on those JDKs (build-all/dist-testskeep the pinned Java 11 build used for the release artifacts).[tp-tests][cql-tests]so the TinkerPop suites also run against BerkeleyJE/CQL/HBase and the full CQL matrix runs.Thank you for contributing to JanusGraph!
In order to streamline the review of the contribution we ask you
to ensure the following steps have been taken:
For all changes:
master)?For code changes:
For documentation related changes:
🤖 Generated with Claude Code